Python多进程与多线程的使用场景详解
前言
Python多进程适用的场景:计算密集型(CPU密集型)任务
Python多线程适用的场景:IO密集型任务
计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。
IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。
下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,
示例1:执行计算密集型任务,进行1亿次运算
使用多进程
frommultiprocessingimportProcess importos,time #计算密集型任务 defwork(): res=0 foriinrange(100*100*100*100):#亿次运算 res*=i if__name__=="__main__": l=[] print("本机为",os.cpu_count(),"核CPU")#本机为64核 start=time.time() foriinrange(4): p=Process(target=work)#多进程 l.append(p) p.start() forpinl: p.join() stop=time.time() print("计算密集型任务,多进程耗时%s"%(stop-start))
使用多线程
fromthreadingimportThread importos,time #计算密集型任务 defwork(): res=0 foriinrange(100*100*100*100):#亿次运算 res*=i if__name__=="__main__": l=[] print("本机为",os.cpu_count(),"核CPU")#本机为64核 start=time.time() foriinrange(4): p=Thread(target=work)#多线程 l.append(p) p.start() forpinl: p.join() stop=time.time() print("计算密集型任务,多线程耗时%s"%(stop-start))
两段代码输出:
本机为64核CPU
计算密集型任务,多进程耗时6.864224672317505
本机为64核CPU
计算密集型任务,多线程耗时37.91042113304138
说明:上述代码中,分别使用4个多进程和4个多线程去执行亿次运算,多进程耗时6.86s,多线程耗时37.91s,可见在计算密集型任务场景,使用多进程能大大提高效率。
另外,当分别使用8个多进程和8个多线程去执行亿次运算时,耗时差距更大,输出如下:
本机为64核CPU
计算密集型任务,多进程耗时6.811635971069336
本机为64核CPU
计算密集型任务,多线程耗时113.53767895698547
可见在64核的cpu机器下,同时使用8个多进程和4个多进程效率几乎一样。而使用多线程则就效率较慢。要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数
示例2:400次,阻塞两秒,读取文件
使用多进程(4核cpu)
frommultiprocessingimportProcess importos,time #I/0密集型任务 defwork(): time.sleep(5)#阻塞两秒 if__name__=="__main__": l=[] print("本机为",os.cpu_count(),"核CPU") start=time.time() foriinrange(1000): p=Process(target=work)#多进程 l.append(p) p.start() forpinl: p.join() stop=time.time() print("I/0密集型任务,多进程耗时%s"%(stop-start))
使用多线程(4核cpu)
fromthreadingimportThread importos,time #I/0密集型任务 defwork(): time.sleep(5)#阻塞两秒 if__name__=="__main__": l=[] print("本机为",os.cpu_count(),"核CPU") start=time.time() foriinrange(1000): p=Thread(target=work)#多线程 l.append(p) p.start() forpinl: p.join() stop=time.time() print("I/0密集型任务,多线程耗时%s"%(stop-start))
输出:
本机为64核CPU
I/0密集型任务,多进程耗时12.28218412399292
本机为64核CPU
I/0密集型任务,多线程耗时5.399136066436768
说明:python的多线程有于GIL锁的存在,无论是多少核的cpu机器,也只能使用单核,从输出结果来看,对于IO密集型任务使用多线程比较占优。
FAQ:执行多进程的io密集型任务时,报了一个错:
OSError:[Errno24]Toomanyopenfiles
原因:linux系统限制
ulimit-n #输出1024
解决:(临时提高系统限制,重启后失效)
ulimit-n10240
总结
到此这篇关于Python多进程与多线程使用场景的文章就介绍到这了,更多相关Python多进程与使用场景内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。