пример многопроцессорного пула не работает и зависает ядро - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь распараллелить скрипт, но по неизвестной причине ядро ​​просто зависает без каких-либо ошибок.

минимальный рабочий пример:

from multiprocessing import Pool

def f(x):
  return x*x

p = Pool(6)
print(p.map(f, range(10)))   

Интересно, что все работает нормальноесли я определю свою функцию в другом файле, импортируйте ее.Как я могу заставить его работать без необходимости использования другого файла?

Я работаю со Spyder (Anaconda) и у меня тот же результат, если я запускаю свой код из командной строки Windows.

1 Ответ

0 голосов
/ 08 октября 2018

Это происходит потому, что вы не защищали свою процедурную часть кода от повторного выполнения, когда ваши дочерние процессы импортируют 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.

Обычно рекомендуется разделять любой сценарий в верхнем «определении» и нижнем «выполнении в качестве основного», чтобы сделать код импортируемым без ненужных выполнений частей, актуальных только при запуске в качестве верхнего уровняскрипт.И последнее, но не менее важное: это облегчает понимание потока управления вашей программы, когда вы не смешиваете определения и исполнения.

...