有一个奇怪的行为,map使用Python的时候multiprocessing.Pool。在下面的示例中,一个由 4 个处理器组成的池将处理 28 个任务。这应该需要七遍,每遍需要 4 秒。
然而,它需要8个pass。在前六轮中,所有处理器都被占用。在第 7 次传递中,仅完成了两个任务(两个空闲处理器)。剩下的 2 个任务在第 8 次传递中完成(再次是两个空闲处理器)。这种行为出现在看似随机的 cpu 数量和任务数量组合中,不必要地浪费时间。
此示例已在 Intel Xeon Haswell(20 核)和 Intel i7(4 核)上重现。
关于如何强制Pool在所有通道中使用所有可用处理器的任何想法?
import time
import multiprocessing
from multiprocessing import Pool
import datetime
def f(values):
now = str(datetime.datetime.now())
proc_id = str(multiprocessing.current_process())
print(proc_id+' '+now)
a=values**2
time.sleep(4)
return a
if __name__ == '__main__':
p = Pool(4) #number of processes
processed_values= p.map( f, range(28))
p.close()
p.join()
print processed_values
Run Code Online (Sandbox Code Playgroud)
运行的输出如下
<Process(PoolWorker-1, started daemon)> 2016-05-13 17:08:49.604065
<Process(PoolWorker-2, …Run Code Online (Sandbox Code Playgroud)