首页 > 解决方案 > 您可以使用 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)”的最大数量是多少,这样我才能获得最大的效率。

标签: python-3.xmultiprocessingpython-3.6pool

解决方案


300 对于操作系统来说太多了,因为在已经有很多新进程的情况下分叉一个新进程变得更加困难。理想情况下,您应该使用multiprocessing.cpu_count()池数。提供更多数字会使 CPU 更难切换上下文。查看上下文切换主题以熟悉它。这实质上意味着如果一个 CPU 内核有多个进程,那么 CPU 必须在进程之间切换以使它们看起来像并行运行。即使您有 32 个 CPU 内核,300 也无法处理上下文切换开销。现在您可能会发现降低 300 的汗水点,但它只适用于您的PC。这就是默认Pool使用的原因multiprocessing.cpu_count(),因此我建议使用它。

如果你的find_max函数是一个轻量级函数(这意味着它不需要太多的 CPU 资源来运行),那么分叉一个进程将比实际运行它昂贵得多。在这种情况下,您应该使用常规循环来完成这项工作。


推荐阅读