Почему модуль многопроцессорности 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

Я не знаю другого способа структурирования кода, чтобы избежать эффекта вилки бомбы.