我正在使用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))
答案 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负责将此逻辑映射到操作系统。