您的位置:首页 > 编程语言 > Python开发

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: