Python Multiprocessing RuntimeError в Windows

У меня есть функция класса (назовем ее "alpha.py"), которая использует многопроцессорность (processes=2) для разветвления процесса и является частью пакета Python, который я написал. В отдельном скрипте Python (назовем его «beta.py») я создал экземпляр объекта из этого класса и вызвал соответствующую функцию, использующую многопроцессорность. Наконец, все это заключено в Python-скрипт-оболочку (назовем его «gamma.py»), который обрабатывает множество различных объектов и функций класса.

По сути:

  1. Запустите ./gamma.py из командной строки.
  2. gamma.py использует подпроцесс и выполняет beta.py
  3. beta.py создает экземпляр объекта из класса alpha.py и вызывает функцию, которая использует многопроцессорность (processes=2)

У него нет проблем с запуском на Mac или Linux. Однако это становится проблемой на компьютере с Windows, и ошибка (и документация) предполагает, что я должен написать это где-нибудь:

if __name__ == '__main__':
    freeze_support()

В этом другом сообщении также упоминается то же самое.

Однако я точно не знаю, где должны находиться эти две строки. В настоящее время ни alpha.py, ни beta.py, ни gamma.py не содержат раздела if __name__ == '__main__':. Было бы здорово, если бы кто-нибудь сказал мне, куда должны идти эти две строки, а также их обоснование.


person slaw    schedule 17.06.2015    source источник
comment
Можете ли вы предоставить сообщение об ошибке, которое вы получаете при этом? трассировки стека? Вы решили это. Я удивлен, что на него не было ответа.   -  person Tom Myddeltyn    schedule 06.07.2016


Ответы (1)


Собственно, freeze_support() здесь и не нужен. Вы получаете RuntimeError, потому что вы создаете и запускаете новые процессы на верхнем уровне вашего модуля beta.

Когда новый процесс создается с помощью multiprocessing в Windows, в этом процессе будет запущен новый интерпретатор Python, который попытается импортировать модуль с целевой функцией, которую необходимо выполнить. Это ваш beta модуль. Теперь, когда вы его импортируете, все ваши операторы верхнего уровня должны быть выполнены, что приведет к созданию и повторному запуску нового процесса. А потом, рекурсивно, другой процесс из этого процесса, и так далее и тому подобное.

Скорее всего, это не то, что вам нужно, поэтому новые процессы должны быть инициализированы и запущены только один раз, когда вы запускаете beta.py напрямую с subprocess.

if __name__ == '__main__': следует поместить в beta.py, затем переместите инициализацию и код запуска для ваших новых процессов в этот раздел. После этого, когда beta.py будет импортирован, а не запущен напрямую, новый процесс запускаться не будет, и вы не увидите никаких побочных эффектов.

person wombatonfire    schedule 12.09.2016