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