python的多进程和多线程

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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值