Python多进程.Pool()不能充分利用每个CPU的100%

10

这是因为你的程序大部分时间只是执行“print”,所以它被称为“I/O绑定”。 - Michael Foukarakis
1
我认为print直到map完成后才开始。同步开销可能会导致某些低利用率。 - user2357112
1
无论如何,这些乘法只需要毫秒级的时间,这使得这个问题有点无意义。 - Michael Foukarakis
谢谢您的评论。但这只是一个例子。我尝试过其他需要更长时间计算的示例,而进程仍然是P1:10%,P2:30%,P3:20%,P4:15%。 - geekygeek
1
请提供一个程序,我们可以用它来重现您的问题。 - Michael Foukarakis
感谢您的建议。请检查这个。 - geekygeek
2个回答

5
这是因为multiprocessing需要在主进程和工作进程之间进行进程间通信,并且这种通信开销所占用的时间比你的情况下的“实际”计算(x * x)还要多(挂钟时间)。尝试使用更“重”的计算内核,例如:
def f(x):
  return reduce(lambda a, b: math.log(a+b), xrange(10**5), x)

更新(澄清)

我指出OP观察到的低CPU使用率是由于multiprocessing中固有的IPC开销,但OP不需要过于担心,因为原始计算内核太“轻”了,无法作为基准测试。换句话说,multiprocessing在这种过度“轻”的内核下工作最差。如果OP在multiprocessing之上实现一个真实世界的逻辑(我确定,它将比x * x要 “重”),那么OP将实现一个不错的效率,我保证。我的论点得到了我呈现的“重”内核的实验支持。

@FilipMalczak,希望我的澄清对您有意义。

顺便提一下,有一些方法可以在使用multiprocessing时提高x * x的效率。例如,我们可以将1,000个作业合并成一个作业,然后再提交给Pool,除非我们需要实时解决每个作业(即如果您实现REST API服务器,则不应以此方式处理)。


看起来是正确的答案,并且会表现得很好,但你错过了多进程的整个重点。 - Filip Malczak

4
您正在提出错误的问题。 multiprocessing.Process 表示您的操作系统中理解的进程。 multiprocessing.Pool 只是一种运行多个进程来完成工作的简单方法。 Python 环境与平衡核心/处理器负载无关。如果您想控制处理器时间如何分配给进程,应尝试调整您的操作系统,而不是 Python 解释器。
当然,“较重”的计算会被系统识别,并且可能看起来像它们正在做您想要做的事情,但是实际上,您几乎无法控制进程处理。 “更重”的函数只会让您的操作系统看起来更加繁重,他通常的反应是为您的进程分配更多的处理器时间,但这并不意味着您已经做到了您想要的 - 这就是带有 VM 的语言的整个重点 - 您指定逻辑,VM 负责将此逻辑映射到操作系统。

谢谢。这有助于更好地理解多进程的工作原理 :) - geekygeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接