Python multiprocessing.Pool()不使用每个CPU的100%

时间:2014-01-25 09:18:00

标签: python multiprocessing cpu-usage pool

我正在使用Python进行多处理。 例如,考虑Python多处理documentation中给出的示例(我在示例中更改了100到1000000,只是为了消耗更多时间)。当我运行它时,我确实看到Pool()正在使用所有4个进程,但我没有看到每个CPU移动到100%。如何将每个CPU的使用率提高100%?

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)            
    result = pool.map(f, range(10000000))  

2 个答案:

答案 0 :(得分:4)

这是因为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在x * x之上实现了一个真实世界的逻辑(我确信,它会比multiprocessing稍微“重”),那么OP将实现一个不错的效率,我保证。我的论点得到了我所提出的“重”内核实验的支持。

@FilipMalczak,我希望我的澄清对你有用。

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

答案 1 :(得分:3)

你问的是一个错误的问题。 multiprocessing.Process表示操作系统中理解的进程。 multiprocessing.Pool只是运行多个流程来完成工作的简单方法。 Python环境与核心/处理器上的负载平衡无关。

如果你想控制处理器的处理时间,你应该尝试调整你的操作系统,而不是python解释器。

当然,系统会识别“较重”的计算,看起来它们可能就像你想做的那样,但事实上,你几乎无法控制过程处理。

“Heavier”功能对你的操作系统来说会更重,而他通常的反应是为你的进程分配更多的处理器时间,但这并不意味着你做了你想做的事 - 这很好,因为整个使用VM的语言点 - 您指定逻辑,VM负责将此逻辑映射到操作系统。