python的多进程和多线程
2017-07-21 19:48
274 查看
python的多进程和多线程
thread、threading、process、multiprocessing 等等模块网上资料很多,不赘述了这里主要简要说明一下自己平时能用到的进程池、线程池,使用”池“的好处是不需要自己去实现各种LOCK.
from multiprocessing.dummy import Pool 就可以使用多线程
from multiprocessing import Poo 可以使用多进程
python的多线程并不是网上说的那样,要看官方文档!不要人云亦云,python的GIL(Global Interpreter Lock)是cpython解释器的问题,和语言无关,任何一个CPython线程如果要执行,就必须先获取这个GIL。后果就是在CPython中,几乎是没有线程并行的,不论你开多少个线程,同一时刻只有获取GIL的那个线程能够执行。为什么要说几乎呢,这是因为提供给python的C库中,还是有解决方案的。解决方案是sleep的代码,在执行sleep之前,通过一个宏来释放GIL,然后在睡眠结束执行其他代码前又获取GIL。这样可以在很大程度上避开GIL来取得线程并行的效果。只要不是整个过程都在疯狂使用CPU,那么多线程的运行效率要超过多进程(进程的创建需要OS分配资源,建立PCB等等,开销要比线程大的多)
python 的其他两个分支,Jython和IronPython,却都没有GIL的问题,从而可以实现真正的线程并行(注意并行和并发的区别,别理解错了)
p=Pool(3) #启动3个进程或者线程 p=Pool() #根据你的CPU核数设置默认值。比如电脑8核,p=Pool()和p=Pool(8)是等效的
#coding=utf-8 import time #如果想变成多进程,把下面的dummy去掉就好 from multiprocessing.dummy import Pool class person: def setName(self,name): self.name=name def getName(self): print(self.name) def greet(self): time.sleep(1) print("hello ,i am %s"%self.name) def examp(name): perso=person() perso.setName(name) perso.greet() if __name__ == '__main__': aa=time.time() people=['tom','amy','mkie','tony','yang','jouge','bob','jany'] #Pool默认启动的进程/线程数量是cpu的核数(准确的说是逻辑运算核心数量) p=Pool() for i in people: p.apply_async(examp, args=(i,)) p.close() p.join() bb=time.time() print(bb-aa)
相关文章推荐
- Python 多进程_进程池_多线程_线程池实现比较
- python多进程、多线程、协程向mysql插入10000条数据
- python并发编程之多进程、多线程、异步和协程
- [python] 连接MySQL,以及多线程、多进程连接MySQL初探
- Python中的多进程和多线程
- Python多线程与多进程
- 为什么在python里推荐使用多进程而不是多线程
- 【Python】多线程 & 多进程(2)
- python使用多进程或者多线程
- 【转】【Python】Python多进程与多线程
- Python的多线程/多进程
- 深入浅析python中的多进程、多线程、协程
- Python中的多进程与多线程(一)
- Python多线程、多进程
- Python 多进程/多线程 学习笔记
- Python多线程与多进程
- Python学习笔记——多线程,多进程
- python concurrent.futures并发库 多进程 多线程
- Python多线程与多进程学习----概念
- python(34):为什么在Python里推荐使用多进程而不是多线程?