池未使用处理器的全部容量

时间:2018-11-29 18:02:18

标签: python multiprocessing threadpool

我正在使用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),但这仍然不是最佳选择。

0 个答案:

没有答案