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

gee*_*eek 7 python pool cpu-usage multiprocessing

我正在使用Python进行多重处理。例如,请考虑Python多处理文档中给出的示例(在示例中我将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))  
Run Code Online (Sandbox Code Playgroud)

nod*_*kai 5

这是因为multiprocessing需要主进程和幕后工作进程之间的进程间通信,并且通信开销比x * x您的情况下的“实际”计算()花费更多(挂钟)时间。

尝试“更重”的计算内核,例如

def f(x):
  return reduce(lambda a, b: math.log(a+b), xrange(10**5), x)
Run Code Online (Sandbox Code Playgroud)

更新(澄清)

我指出 OP 观察到的低 CPU 使用率是由于固有的 IPC 开销,multiprocessing但 OP 不需要过多担心,因为原始计算内核太“轻”而无法用作基准. 换句话说,multiprocessing使用这种方式太“轻”的内核效果最差。如果 OPx * x在 之上实现现实世界的逻辑(我敢肯定,它会比 更“重” )multiprocessing,我保证,OP 将实现不错的效率。我的论点得到了我提出的“重”内核实验的支持。

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

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