2013-01-05 15 views
13

Gram z biblioteką dla moich początkujących studentów i używam modułu wieloprocesorowego w Pythonie. Wpadłem na ten problem: importing and using a module that uses multiprocessing without causing infinite loop on WindowsDlaczego moduł wieloprocesowy Pythona importuje __main__ podczas rozpoczynania nowego procesu w systemie Windows?

Jako przykład załóżmy, że mam moduł 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() 

a główny program, który wywołuje tę bibliotekę:

# main.py 

import mylibrary 

mylibrary.foo() 

Jeśli biegnę main.py na Windows, próbuje zaimportować plik main.py do nowego procesu, co oznacza, że ​​kod jest ponownie uruchamiany, co powoduje nieskończoną pętlę generowania procesu. Mogę go naprawić tak:

import mylibrary 

if __name__ == "__main__": 
    mylibrary.foo() 

Ale to jest dość mylące dla początkujących, a ponadto wydaje się, że nie powinno być konieczne. Nowy proces jest tworzony w mylibrary, więc dlaczego nowy proces nie po prostu zaimportuje mylibrary? Czy istnieje sposób obejścia tego problemu bez konieczności zmiany main.py?

Używam Python 2.7, przy okazji.

Odpowiedz

23

Windows nie ma fork, więc nie ma sposobu na nowy proces, podobnie jak istniejący. Zatem proces potomny musi ponownie uruchomić twój kod, ale teraz potrzebujesz sposobu na rozróżnienie procesu nadrzędnego od procesu podrzędnego, i to jest to, czy jest to __main__.

To jest pokryta tu docs: http://docs.python.org/2/library/multiprocessing.html#windows

Nie znam innego sposobu uporządkowania kodu w celu uniknięcia efektu widelca bomba.

+4

Ta odpowiedź powinna zostać przyjęta. – Marcin

+1

Jestem pewien, że czegoś mi brakuje, ale moje pytanie brzmi, dlaczego proces potomny musi ponownie uruchomić cały kod. Dlaczego nie tylko moduł, który rozpoczął nowy proces? – Laura

+0

@Laura: musi ponownie uruchomić cały kod, ponieważ w przeciwnym razie nie miałby twojego kodu. Proces potomny zaczyna być całkowicie nowy, a jeśli chcesz, aby Twoje funkcje działały, potrzebuje twojego kodu. –

Powiązane problemy