Python 多处理。Pool() 不会 100% 使用每个 CPU



我正在python中进行多处理。例如,考虑Python多处理文档中给出的示例(在示例中我更改了100到1000000,只是为了消耗更多时间)。当我运行此操作时,我确实看到该池()正在使用所有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))  

这是因为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服务器,否p>

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

如果您想控制如何将处理器时间给予流程,则应尝试调整操作系统,而不是Python解释器。

当然,"更重"的计算将被系统识别,并且看起来像是您想做的事情,但实际上,您几乎无法控制流程处理。

"更重"功能只会对您的操作系统看起来更重,他通常的反应将为您的流程分配更多的处理器时间,但这并不意味着您做了您想要的工作 - 这很好,因为这整个过程都很好使用VM的语言点 - 您指定逻辑,而VM会照顾将此逻辑映射到操作系统上。