Python多进程和多线程的使用场景

更新时间:2021-03-10 14:12:01点击次数:881次
Python多进程适用的场景:计算密集型(CPU密集型)任务
Python多线程适用的场景:IO密集型任务
计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。
IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。
下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,
示例1:执行计算密集型任务,进行1亿次运算
使用多进程
from multiprocessing import Process
import 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 Thread
import 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的核心数
示例2:400次,阻塞两秒,读取文件
使用多进程(4核cpu)
from multiprocessing import Process
import 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 Thread
import 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

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息