Это происходит потому, что вы не защищали свою процедурную часть кода от повторного выполнения, когда ваши дочерние процессы импортируют f
.
Им нужно импортировать f
, потому что Windows не поддерживает разветвление в качестве метода запуска для новых процессов (только порождение).Новый процесс Python должен быть запущен с нуля, импортирован f
, и этот импорт также вызовет создание другого пула во всех дочерних процессах ... и их дочерних процессах и их дочерних процессах.
Чтобы предотвратить эту рекурсию, вы должны вставить if __name__ == '__main__':
-линию между верхней частью, которая должна выполняться при импорте, и нижней частью, которая должна выполняться только тогда, когда ваш сценарий выполняется как основной сценарий (только в случаеparent).
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__': # protect your program's entry point
p = Pool(6)
print(p.map(f, range(10)))
Такое разделение кода обязательно для многопроцессорной обработки в системах Windows и Unix-y при использовании метода запуска forkserver вместо стандартного fork.
Обычно рекомендуется разделять любой сценарий в верхнем «определении» и нижнем «выполнении в качестве основного», чтобы сделать код импортируемым без ненужных выполнений частей, актуальных только при запуске в качестве верхнего уровняскрипт.И последнее, но не менее важное: это облегчает понимание потока управления вашей программы, когда вы не смешиваете определения и исполнения.