многопроцессорная функция вызова pool.map в определенном порядке
Как я могу заставить multiprocessing.pool.map распределять процессы в числовом порядке?
Больше информации:
У меня есть программа, которая обрабатывает несколько тысяч файлов данных, составляя график каждого из них. Я используюmultiprocessing.pool.map
распространять каждый файл на процессор, и он прекрасно работает. Иногда это занимает много времени, и было бы неплохо посмотреть на выходные изображения во время работы программы. Это было бы намного проще, если бы процесс карты распределял снимки по порядку; вместо этого, для конкретного запуска, который я только что выполнил, первые 8 проанализированных снимков были:0, 78, 156, 234, 312, 390, 468, 546
, Есть ли способ заставить его распределять их более точно в числовом порядке?
Пример:
Вот пример кода, который содержит те же ключевые элементы и показывает тот же основной результат:
import sys
from multiprocessing import Pool
import time
num_proc = 4; num_calls = 20; sleeper = 0.1
def SomeFunc(arg):
time.sleep(sleeper)
print "%5d" % (arg),
sys.stdout.flush() # otherwise doesn't print properly on single line
proc_pool = Pool(num_proc)
proc_pool.map( SomeFunc, range(num_calls) )
Урожайность:
0 4 2 6 1 5 3 7 8 10 12 14 13 11 9 15 16 18 17 19
Ответ:От @Hayden: используйте параметр 'chunksize',def map(self, func, iterable, chunksize=None)
.
Больше информации:chunksize
определяет, сколько итераций выделяется каждому процессору за раз. Например, в приведенном выше примере используется размер фрагмента 2 - это означает, что каждый процессор выключается и выполняет свою функцию в течение двух итераций функции, а затем возвращается для получения дополнительной информации («регистрация»). Компромисс между размером chunksize заключается в том, что для «регистрации» возникают дополнительные издержки, когда процессор должен синхронизироваться с остальными, что предполагает, что вы хотитебольшой размер, С другой стороны, если у вас большие чанки, то один процессор может завершить свою чанку, в то время как у другого осталось еще много времени - так что вы должны использоватьмаленький кусочек, Я предполагаю, что дополнительная полезная информация заключается в том, сколько существует диапазона и сколько времени может занять каждый вызов функции. Если они действительно должны занимать одинаковое количество времени - гораздо эффективнее использовать большой размер куска. С другой стороны, если некоторые вызовы функций могут занимать в два раза больше времени, чем другие, вам нужен небольшой размер фрагмента, чтобы процессоры не задерживались на ожидании.
Для моей проблемы каждый вызов функции должен занимать очень близкое количество времени (я думаю), поэтому, если я хочу, чтобы процессы вызывались по порядку, я пожертвую эффективностью из-за накладных расходов на регистрацию.