Пул не использует полную мощность процессоров - PullRequest
0 голосов
/ 29 ноября 2018

Я использую Python3 multiprocessing lib, чтобы я мог выполнить свой код в своем университетском кластере.Хотя я заметил, что 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),все же это все еще не оптимально.

...