#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 — это правильно?