Python多进程与多线程的使用场景详解

作者:大帅不是我 时间:2022-11-21 09:17:37 

前言

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

总结

来源:https://blog.csdn.net/hhs_1996/article/details/114317308

标签:python,多进程,使用场景
0
投稿

猜你喜欢

  • 详解Python 3D引擎Ursina如何绘制立体图形

    2021-11-17 06:04:20
  • 详解将DataGrip连接到MS SQL Server的方法

    2024-01-17 00:41:14
  • MySQL中用通用查询日志找出查询次数最多的语句的教程

    2024-01-13 23:18:00
  • 浅析设计与内容呈现的关系

    2009-08-06 18:12:00
  • 深入讨论Python函数的参数的默认值所引发的问题的原因

    2022-08-03 00:54:31
  • go实现脚本解释器gscript

    2023-10-12 00:49:39
  • Python astype(np.float)函数使用方法解析

    2021-02-23 17:28:16
  • 三分钟教会你用Python+OpenCV批量裁剪xml格式标注的图片

    2023-07-09 14:11:01
  • 使用python编写android截屏脚本双击运行即可

    2021-01-25 20:47:19
  • php is_numberic函数造成的SQL注入漏洞

    2023-07-18 00:32:25
  • 基于JS实现Android,iOS一个手势动画效果

    2024-04-28 09:36:41
  • Python 读取WAV音频文件 画频谱的实例

    2021-11-27 02:23:43
  • python+Django+pycharm+mysql 搭建首个web项目详解

    2024-01-18 22:18:07
  • python整合ffmpeg实现视频文件的批量转换

    2023-06-07 03:03:12
  • Python实现Excel自动分组合并单元格

    2021-11-06 03:03:41
  • 对python的bytes类型数据split分割切片方法

    2021-01-07 03:09:14
  • 利用Python发送邮件或发带附件的邮件

    2023-01-17 12:40:31
  • 很酷的JQuery Solar System

    2007-12-15 08:09:00
  • Python 一篇文章看懂时间日期对象

    2022-12-23 04:29:14
  • 使用phpMyAdmin修改MySQL数据库root用户密码的方法

    2023-11-20 02:12:13
  • asp之家 网络编程 m.aspxhome.com