您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python多进程与多线程的使用场景详解

51自学网 2021-10-30 22:53:15
  python
这篇教程Python多进程与多线程的使用场景详解写得很实用,希望能帮到您。

前言

Python多进程适用的场景:计算密集型(CPU密集型)任务

Python多线程适用的场景:IO密集型任务

计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计算性能。

IO密集型任务一般指输入输出型,比如文件的读取,或者网络的请求,这类场景一般会遇到IO阻塞,使用多核CPU来执行并不会有太高的性能提升。

下面使用一台64核的虚拟机来执行任务,通过示例代码来区别它们,

示例1:执行计算密集型任务,进行1亿次运算

使用多进程

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的核心数

示例2:400次,阻塞两秒,读取文件

使用多进程(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多进程与使用场景内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


python jieba库的基本使用
Python接入MySQL实现增删改查的实战记录
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。