многопроцессорная функция вызова 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 заключается в том, что для «регистрации» возникают дополнительные издержки, когда процессор должен синхронизироваться с остальными, что предполагает, что вы хотитебольшой размер, С другой стороны, если у вас большие чанки, то один процессор может завершить свою чанку, в то время как у другого осталось еще много времени - так что вы должны использоватьмаленький кусочек, Я предполагаю, что дополнительная полезная информация заключается в том, сколько существует диапазона и сколько времени может занять каждый вызов функции. Если они действительно должны занимать одинаковое количество времени - гораздо эффективнее использовать большой размер куска. С другой стороны, если некоторые вызовы функций могут занимать в два раза больше времени, чем другие, вам нужен небольшой размер фрагмента, чтобы процессоры не задерживались на ожидании.

Для моей проблемы каждый вызов функции должен занимать очень близкое количество времени (я думаю), поэтому, если я хочу, чтобы процессы вызывались по порядку, я пожертвую эффективностью из-за накладных расходов на регистрацию.

Ответы на вопрос(2)

Ваш ответ на вопрос