Гарантируется ли получение результатов по порядку при использовании multiprocessing.Pool.map()?

#python #python-3.x #multiprocessing

#python #python-3.x #многопроцессорность

Вопрос:

При использовании multiprocessing.Pool.map() гарантируется ли получение результатов по порядку, даже если для завершения func() требуется разное количество времени? (Т. Е. 2-й рабочий может закончить раньше 1-го рабочего и т.д.)

 def func(arg):
    # stuff that takes random time to complete ...
    return arg

args = [1, 2, 3, 4]
pool = mp.Pool(processes=4)
results = pool.map(func, args)
print(results)
  

В этом примере гарантируется, что результаты будут напечатаны как [1, 2, 3, 4] ? Если нет, то как я могу убедиться, что это произойдет?

Ответ №1:

Да, с multiprocessing.Pool.map методом результат всегда будет соответствовать порядку соответствующих элементов в заданной итерации, вот почему этот метод будет блокироваться до завершения всех дочерних процессов.

Комментарии:

1. Произойдет ли то же самое, если я вызову его с помощью results = [pool.apply(func, args=(x,)) for x in range(1,5)] вместо map ?

2. Используя apply метод, вы, безусловно, гарантируете результирующий порядок, поскольку каждый вызов apply блокируется до завершения дочернего процесса, но тогда вы не получите никакой выгоды от параллельной обработки, поскольку дочерние процессы затем просто выполняются последовательно.

3. о, последний вопрос. Если бы я должен был вызвать map с аргументами = [1, 2, 3, 4, 5], но оставьте размер пула равным 4, тогда тот, кто первым завершит свою задачу, будет обрабатывать 5 — это правильно?