我正在使用Python3的multiprocessing
库,以便可以在大学集群上执行代码。尽管我注意到Pool
并没有以最好的方式分发作品,但我正在寻找一种避免这种情况的方式。例如下面的代码:
>>> from time import sleep
>>> import multiprocessing as mp
>>>
>>> def f(i):
... if i == 0:
... sleep(4)
... print(i, end='\t')
...
>>> with mp.Pool(2) as pool:
... _ = pool.map(f, range(100))
...
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 0 1 2 34 5 6 7 8 9 10 11 12
我们可以看到,与其他99个任务相比,要执行的第一个任务花费了大量时间,而Process
仍然由12个首要任务负责。这意味着进程#2必须执行任务13-> 99,然后等待进程#1完成(因此处理1-> 12)。这显然不是最佳选择,因为流程#1在流程#2完成任务1之前完成了。
有没有一种方法可以强制进程#1在某些任务可用时继续执行任务,即在这种情况下,强制任务2-> 12在进程#2上执行?
我尝试调整chunksize
参数,有点帮助(例如,将其设置为2会强制进程#1执行任务3-> 12),但这仍然不是最佳选择。