使用Pool可以生成的最大多进程数是多少?

时间:2018-06-01 22:12:26

标签: python-3.x multiprocessing python-3.6 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)”中输入的最大数量是多少,这样我就可以获得最大的效率。

1 个答案:

答案 0 :(得分:0)

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

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