Я использую 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),все же это все еще не оптимально.