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服务器,则不应以此方式处理)。
multiprocessing.Process
表示您的操作系统中理解的进程。 multiprocessing.Pool
只是一种运行多个进程来完成工作的简单方法。 Python 环境与平衡核心/处理器负载无关。如果您想控制处理器时间如何分配给进程,应尝试调整您的操作系统,而不是 Python 解释器。
print
直到map
完成后才开始。同步开销可能会导致某些低利用率。 - user2357112