时间:2021-05-22
Python多进程适用的场景:计算密集型(CPU密集型)任务
Python多线程适用的场景:IO密集型任务
计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。
IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。
下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,
使用多进程
from multiprocessing import Processimport os, time # 计算密集型任务def work(): res = 0 for i in range(100 * 100 * 100 * 100): # 亿次运算 res *= i if __name__ == "__main__": l = [] print("本机为", os.cpu_count(), "核 CPU") # 本机为64核 start = time.time() for i in range(4): p = Process(target=work) # 多进程 l.append(p) p.start() for p in l: p.join() stop = time.time() print("计算密集型任务,多进程耗时 %s" % (stop - start))使用多线程
from threading import Threadimport os, time # 计算密集型任务def work(): res = 0 for i in range(100 * 100 * 100 * 100): # 亿次运算 res *= i if __name__ == "__main__": l = [] print("本机为", os.cpu_count(), "核 CPU") # 本机为64核 start = time.time() for i in range(4): p = Thread(target=work) # 多线程 l.append(p) p.start() for p in l: 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的核心数
使用多进程(4核cpu)
from multiprocessing import Processimport os, time # I/0密集型任务def work(): time.sleep(5) # 阻塞两秒 if __name__ == "__main__": l = [] print("本机为", os.cpu_count(), "核 CPU") start = time.time() for i in range(1000): p = Process(target=work) # 多进程 l.append(p) p.start() for p in l: p.join() stop = time.time() print("I/0密集型任务,多进程耗时 %s" % (stop - start))使用多线程(4核cpu)
from threading import Threadimport os, time # I/0密集型任务def work(): time.sleep(5) # 阻塞两秒 if __name__ == "__main__": l = [] print("本机为", os.cpu_count(), "核 CPU") start = time.time() for i in range(1000): p = Thread(target=work) # 多线程 l.append(p) p.start() for p in l: 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: [Errno 24] Too many open files
原因:linux系统限制
ulimit -n# 输出 1024解决:(临时提高系统限制,重启后失效)
ulimit -n 10240到此这篇关于Python多进程与多线程使用场景的文章就介绍到这了,更多相关Python多进程与使用场景内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python多线程和多进程区别是: 1、多线程可以共享全局变量,而多进程是不能的。 2、多线程中,所有子线程的进程号相同;多进程中不同的子进程进程号不同。
Python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程。python提供了非常好用的多进程包M
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包
linux下的C\C++多进程多线程编程实例详解1、多进程编程#include#include#includeintmain(){pid_tchild_pid;