Почему модуль многопроцессорности Python импортирует __main__ при запуске нового процесса в Windows?
Я играю с библиотекой для своих учеников-новичков, и я использую модуль многопроцессорности в Python. Я столкнулся с этой проблемой: импорт и использование модуля, который использует многопроцессорность, не вызывая бесконечного цикла в Windows
В качестве примера предположим, что у меня есть модуль mylibrary.py
:
# mylibrary.py
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print "Hello from the new process"
def foo():
p = MyProcess()
p.start()
И основная программа, которая вызывает эту библиотеку:
# main.py
import mylibrary
mylibrary.foo()
Если я запустил main.py
в Windows, он попытается импортировать main.py в новый процесс, что означает, что код выполняется снова, что приводит к бесконечному циклу генерации процесса. Я могу исправить это так:
import mylibrary
if __name__ == "__main__":
mylibrary.foo()
Но это довольно запутанно для новичков, и, более того, похоже, что это не обязательно. Новый процесс создается в mylibrary
, поэтому почему новый процесс просто не импортирует mylibrary
? Есть ли способ обойти эту проблему, не main.py
?
Кстати, я использую Python 2.7.
Ответы
Ответ 1
В Windows нет fork
, поэтому нет способа сделать новый процесс так же, как существующий. Таким образом, дочерний процесс должен снова запустить ваш код, но теперь вам нужно различать родительский процесс и дочерний процесс, а __main__
- это.
Это описано в документах: http://docs.python.org/2/library/multiprocessing.html#windows
Я не знаю другого способа структурирования кода, чтобы избежать эффекта вилки бомбы.