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

 更新时间:2021年03月05日 16:08:35   作者:大帅不是我  
这篇文章主要给大家介绍了关于Python多进程与多线程使用场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

总结

到此这篇关于Python多进程与多线程使用场景的文章就介绍到这了,更多相关Python多进程与使用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 调整Jupyter notebook的启动目录操作

    调整Jupyter notebook的启动目录操作

    这篇文章主要介绍了调整Jupyter notebook的启动目录操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python单机五子棋的代码实现示例

    python单机五子棋的代码实现示例

    五子棋是经典的棋牌类游戏,很多人都玩过,那么如何用Python实现五子棋呢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 老生常谈python中的重载

    老生常谈python中的重载

    所谓重载,就是多个相同函数名的函数,根据传入的参数个数,参数类型而执行不同的功能。所以函数重载实质上是为了解决编程中参数可变不统一的问题。这篇文章主要介绍了老生常谈python中的重载,需要的朋友可以参考下
    2018-11-11
  • Python获取统计自己的qq群成员信息的方法

    Python获取统计自己的qq群成员信息的方法

    这篇文章主要介绍了Python获取统计自己的qq群成员信息的方法,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • python中设置超时跳过,超时退出的方式

    python中设置超时跳过,超时退出的方式

    今天小编就为大家分享一篇python中设置超时跳过,超时退出的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python如何对数组进行降维

    python如何对数组进行降维

    这篇文章主要介绍了python如何对数组进行降维问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 使用pycharm运行flask应用程序的详细教程

    使用pycharm运行flask应用程序的详细教程

    这篇文章主要介绍了使用pycharm运行flask应用程序,首先大家需要使用pycharm创建你的第一个app,接下来就开始配置pycharm,需要的朋友可以参考下
    2021-06-06
  • Python tkinter实现的图片移动碰撞动画效果【附源码下载】

    Python tkinter实现的图片移动碰撞动画效果【附源码下载】

    这篇文章主要介绍了Python tkinter实现的图片移动碰撞动画效果,涉及Python tkinter模块操作图片基于坐标动态变换与数值判定实现移动、碰撞检测等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • Python查找多个字典公共键key的方法

    Python查找多个字典公共键key的方法

    这篇文章主要介绍了Python查找多个字典公共键key案例,文章主要通过案例分享展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 详解Python手写数字识别模型的构建与使用

    详解Python手写数字识别模型的构建与使用

    这篇文章主要为大家详细介绍了Python中手写数字识别模型的构建与使用,文中的示例代码简洁易懂,对我们学习Python有一定的帮助,需要的可以参考一下
    2022-12-12

最新评论