python-3.x - 您可以使用 Pool 生成的最大多进程数量是多少?
问题描述
我有一个代码,我需要实现一种方法来在包含 1341 个 URL 的列表中找到最大值,我必须在其中创建一个从输入的 URL 获得的值列表并找到最大值。
我尝试使用 Pool 来加快这个过程,但我不确定我可以生成多少个多进程。例如,如果我使用:
if __name__ == '__main__':
with Pool(10) as p:
print(p.map(find_max, urls))
这可行,但仍然需要很长时间才能完成我列表中的 1341 项。所以我尝试了这个:
if __name__ == '__main__':
with Pool(300) as p:
print(p.map(find_max, urls))
我收到一条错误消息,提示我打开了太多文件。我想知道我可以放入“Pool(num)”的最大数量是多少,这样我才能获得最大的效率。
解决方案
300 对于操作系统来说太多了,因为在已经有很多新进程的情况下分叉一个新进程变得更加困难。理想情况下,您应该使用multiprocessing.cpu_count()
池数。提供更多数字会使 CPU 更难切换上下文。查看上下文切换主题以熟悉它。这实质上意味着如果一个 CPU 内核有多个进程,那么 CPU 必须在进程之间切换以使它们看起来像并行运行。即使您有 32 个 CPU 内核,300 也无法处理上下文切换开销。现在您可能会发现降低 300 的汗水点,但它只适用于您的PC。这就是默认Pool
使用的原因multiprocessing.cpu_count()
,因此我建议使用它。
如果你的find_max
函数是一个轻量级函数(这意味着它不需要太多的 CPU 资源来运行),那么分叉一个进程将比实际运行它昂贵得多。在这种情况下,您应该使用常规循环来完成这项工作。
推荐阅读
- html - 在 ASP.NET Core 中流式传输时如何设置持续时间视频?
- php - XAMPP 中的 PHP 脚本显示乱码
- php - 无法将 Eloquent 模型传递给 Laravel Job
- sqlite - 使用 SQLite3 中的 INT 主键在任意位置插入表的成本
- php - PHP DateTime 使用静态对象与新对象
- python - 为什么不将元组设置为我的 dict 的键?
- android - 如果使用 GCM 的旧应用没有迁移到 FCM 的计划,2019 年 4 月之后会发生什么?
- bash - 如何通过移动/替换字符和转换文件名中的日期格式来重命名 bash 中的多个文件?
- python - 使用函数作为参数在 Python 中编写重试机制
- python - 写入 TensorArray 错误:“无法读取索引”