python的多进程和多线程

来源:互联网 发布:minecraft模块编程 编辑:程序博客网 时间:2024/05/20 07:19

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 Poolclass 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)
原创粉丝点击