我正在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会照顾将此逻辑映射到操作系统上。