我有一个代码,我需要在其中实现一种方法来在包含 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))
我收到一个错误,说我打开的文件太多。 我想知道我可以放入"池(num("的最大数字是多少,以便我可以获得最大的效率。
> 300 对于操作系统来说太多了,因为在已经有很多新进程的情况下分叉新进程变得更加困难。理想情况下,应使用multiprocessing.cpu_count()
数量的池。提供更多数字会使切换 CPU 上下文变得更加困难。查看上下文切换主题以熟悉它。这实质上意味着,如果一个 CPU 内核有多个进程,则 CPU 必须在进程之间切换,使它们看起来像是并行运行。即使您有 32 个 CPU 内核,300 个内核也太多了,无法处理上下文切换开销。现在您可能会发现降低 300 的汗点,但它仅适用于您的PC。这就是为什么Pool
默认使用multiprocessing.cpu_count()
,因此我建议使用它。
如果你的find_max
函数是一个轻量级函数(这意味着它不需要太多的CPU资源来运行(,那么分叉一个进程将比实际运行它昂贵得多。在这种情况下,您应该使用常规循环来完成这项工作。