使用多处理模块在 Python 中一次运行多个函数。
微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩
你想快速并行地运行 CPU/IO 密集型任务?为什么不直接使用 C、C#、GoLang 或 Rust?尽管 python 比大多数语言慢,并且不是此类任务的首选,但它的直观性和社区支持使原型制作和快速迭代您的想法变得更加容易。需要我提醒你 python 有多少开源包吗?从 ML 到音频编辑,几乎任何东西都可以找到一个包!
问题陈述
我有一个函数需要执行以下操作:
1.从存储中读取一堆文件(I/O密集型)
-
对数据进行一些密集型计算(CPU Intensive)
-
将最终结果上传到云桶(I/O Intensive)
运行多线程与多进程
对于我的问题陈述,运行多进程而不是线程是有意义的,因为:
1.函数主要是CPU密集型而非IO密集型
2.每个函数调用都可以在自己的内存空间中运行
-
进程调度由 OS 而不是 Python 处理
4.不用担心Python全局解释器锁(GIL)
多处理模块
多处理模块有助于生成与线程模块非常相似的进程。
这是一个示例代码:
from multiprocessing import Pool
def functionToRunParallely(i)
# do Work
return i
noOfPools = 5
if __name__ == "__main__"
with Pool(noOfPools) as p:
p.map(functionToRunParallely,[arg1,arg2,...])
您可以将池数设置为与 CPU 中的内核数相同。如果函数是 CPU 密集型的,那么增加池的数量将占用更多的内存并不一定会提高速度。我们可以通过以下示例来验证这一点:
池数量对性能的影响
CPU 密集型任务的池数量与计算时间
我们将采用一个简单的函数来非常低效地计算 100000000 之前的自然数之和。下面的函数在我的系统上运行大约需要 3 秒
运行大约需要 3 秒的简单函数
# Simple function that takes ~3 seconds to run
def pureCpuIntensive(x):
sum=0
for x in range(100000000):
sum+=x
以下是结果:
Takeaways
-
池的数量仅与可用内核的数量有关。之后,所花费的时间大致恒定。
-
对于# of pools > 8,耗时波动,内存占用持续上升。
计算网络密集型任务所需的池数
我写了一个简单的后端,在发送请求之前将请求延迟 5 秒。我已将其部署在本地主机上,以消除结果中互联网连接的不确定性。我们将使用一个简单的函数向后端发出 GET 请求并保存请求。下面的函数在我的系统上运行大约需要 5 秒
def pureNetworkIntensive(i):
x =requests.get("http://localhost:8000")
以下是结果:
Takeaways
-
即使在池数量 > 可用核心数量之后,所用时间也会减少。这是因为当函数等待服务器响应时,多处理模块开始处理下一个函数。所以在这种情况下,池在等待响应时“共享”CPU 资源。
-
一旦池的数量超过可用核心的数量,在池之间切换就会产生开销。在某些情况下,开销可能大于首先使用多个池实现的最小化。
多处理模块的缺点
-
生成池和管理输入占用大量内存
-
局部变量不在子进程之间共享
-
未针对基于网络/IO 的功能进行优化
结论
多处理模块最适合并行运行大部分 CPU 密集型任务。这些函数有自己的内存空间,并且独立于其他函数运行。但是,在网络密集型功能的情况下,这不是最有效的运行方式。在这种情况下,多线程更有用和高效。
推荐书单
《PyTorch深度学习简明实战 》
本书针对深度学习及开源框架——PyTorch,采用简明的语言进行知识的讲解,注重实战。全书分为4篇,共19章。深度学习基础篇(第1章~第6章)包括PyTorch简介与安装、机器学习基础与线性回归、张量与数据类型、分类问题与多层感知器、多层感知器模型与模型训练、梯度下降法、反向传播算法与内置优化器。计算机视觉篇(第7章~第14章)包括计算机视觉与卷积神经网络、卷积入门实例、图像读取与模型保存、多分类问题与卷积模型的优化、迁移学习与数据增强、经典网络模型与特征提取、图像定位基础、图像语义分割。自然语言处理和序列篇(第15章~第17章)包括文本分类与词嵌入、循环神经网络与一维卷积神经网络、序列预测实例。生成对抗网络和目标检测篇(第18章~第19章)包括生成对抗网络、目标检测。
本书适合人工智能行业的软件工程师、对人工智能感兴趣的学生学习,同时也可作为深度学习的培训教程。
作者简介:
日月光华:网易云课堂资深讲师,经验丰富的数据科学家和深度学习算法工程师。擅长使用Python编程,编写爬虫并利用Python进行数据分析和可视化。对机器学习和深度学习有深入理解,熟悉常见的深度学习框架( PyTorch、TensorFlow)和模型,有丰富的深度学习、数据分析和爬虫等开发经验,著有畅销书《Python网络爬虫实例教程(视频讲解版)》。
购买链接(新书限时5.5折):https://item.jd.com/13528847.html
精彩回顾
微信搜索关注《Python学研大本营》
访问【IT今日热榜】,发现每日技术热点