2010-08-04 9 views
15

Nie rozumiem dlaczego ten prosty kodPython wieloprocesorowe ciągły ikra procesy pythonw.exe nie robiąc żadnej pracy

# file: mp.py 
from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

p = Process(target= func, args= (2,)) 
p.start() 
p.join() 
p.terminate() 
print 'done' 
sys.stdout.flush() 

tworzy procesy „pythonw.exe” ciągły i niczego nie drukuje, mimo go uruchomić z wiersza poleceń:

python mp.py 

Używam najnowszy Pythona 2.6 na Windows 7 zarówno 32 i 64 bity

+0

Co jest wyjście, gdy jest uruchomiony? –

+0

brak danych wyjściowych – lj8888

Odpowiedz

32

Musisz protect then entry point of the program by using if __name__ == '__main__':.

To jest problem specyficzny dla systemu Windows. W systemie Windows moduł musi zostać zaimportowany do nowego interpretera języka Python, aby uzyskać dostęp do kodu docelowego. Jeśli nie zatrzymasz tego nowego tłumacza, który uruchomi kod startowy, odrodzi się ono na kolejnym potomku, które będzie odradzać kolejne dziecko, aż do momentu, w którym okaże się to możliwe.

Inne platformy używają os.fork() do uruchamiania podprocesów, więc nie ma problemu z ponownym zaimportowaniem modułu.

Więc kod trzeba będzie wyglądać następująco:

from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

if __name__ == '__main__': 
    p = Process(target= func, args= (2,)) 
    p.start() 
    p.join() 
    p.terminate() 
    print 'done' 
    sys.stdout.flush() 
+1

taki łatwy detal, tak łatwo go przeoczyć który działał, dzięki – lj8888

+1

Ten threaad był ratunkiem życia, mój prosty skrypt pythonowy spawnował "zillions" pythonw.exe i powodował, że Windows przeładowywał i przewracał się. Dzięki! – Hornbydd

1

zabawne, działa na moim komputerze z systemem Linux:

$ python mp.py 
works 4 
done 
$ 

Czy proces wieloprocesowy ma działać w systemie Windows? Wiele programów pochodzących ze świata uniksowego nie radzi sobie tak dobrze z Windows, ponieważ Unix używa fork(2) do taniego klonowania procesów, ale (jest to moim zdaniem), że Windows nie wspiera z wdzięcznością, jeśli w ogóle, to jest fork(2).

+5

System Windows nie obsługuje widelca, więc musi uruchomić nowy interpreter języka Python i ponownie zaimportować moduł, tj. Skrypt. Jeśli nie zabezpieczyłeś kodu startowego 'if __name__ == '__main __':' to zostanie ono uruchomione przez proces potomny, który nie jest dobry. –

+2

... który jest uruchamiany przez proces potomny dziecka, który jest uruchamiany przez proces dziecka dziecka, który ... – PaulMcG

Powiązane problemy