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)
阅读全文
1 0
- python的多线程和多进程
- Python :多线程和多进程的选择
- python的多进程和多线程
- python 多进程和多线程
- python 多线程和多进程
- python多进程和多线程
- Python 多进程和多线程
- Python多线程和多进程
- Python多进程和多线程
- Python的多线程/多进程
- python 实现多进程和多线程的例子
- 学习python多线程和多进程的一点感想
- python 多线程和多进程的区别 mutiprocessing theading
- python中多进程和多线程的配合使用
- python的多线程和多进程网络编程
- Python多线程多进程和线性执行的比较
- Python中的GIL、多进程和多线程
- python中的多线程和多进程
- hdu 4034
- 逻辑回归实现
- 关于python的urlparse.urljoin
- poj1506(栈优化技巧)
- PE之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)
- python的多进程和多线程
- 11-Vue指令之V-on
- 暑期集训之美素数问题
- PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)
- 创建JDBC应用程序
- 摘录 成员变量和局部变量的 不同
- 一件很诡异的事
- hods2896(AC自动机)
- FileNotFoundException on proguard-android.txt file