2010-05-05 11 views
12

Mam problem z kodem poniżej iz dowolnym kodem korzystającym z funkcji print w procesach podrzędnych. Nie widzę żadnych wydrukowanych wyciągów, nawet jeśli używam sys.std[err|out].write('worker') zamiast print.Procesy potomne utworzone przy użyciu modułu wieloprocesorowego Pythona nie będą drukować

Jest to kod (from the official python documentation):

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

Wyjście jest pusty.

Uwaga: Poniższy kod wykorzystuje moduł wątków i wypisuje wynik:

import threading 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = threading.Thread(target=f, args=('bob',)) 
    p.start() 
    p.join() 

Output: hello bob

Czy możesz wskazać mi do rozwiązania? Z góry dziękuję.

Odpowiedz

19

Spróbuj tego:

from multiprocessing import Process 
import sys 

def f(name): 
    print 'hello', name 
    sys.stdout.flush() 

... 

AFAIK standardowe wyjście przetworzonego zrodził przez moduł multiprocessing są buforowane, stąd widać wyjście tylko jeśli bufor zapełni się lub gdy wyraźnie równo sys.stdout.

+0

Wielkie dzięki, Tamas, ale to w moim przypadku nie zadziałało ... – John

+0

Na jakiej platformie jesteś? Powyższe działa dla mnie na Mac OS X; w rzeczywistości działa nawet bez puszczania sys.stdout. –

+1

Tamas, platforma, nad którą pracuję, to win32. Przy okazji, do tej pory próbowałem uruchomić kod w IDLE. Dzisiaj próbowałem uruchomić go z wiersza poleceń, używając następującej składni: python.exe my_prog.py i zadziałało. Ktoś wie, dlaczego? I jak wyświetlić wydruki, uruchamiając programy w IDLE? – John

3

Dokumenty do przetwarzania wieloprocesowego jednoznacznie wyjaśniają, że to nie zadziała!

"Uwaga: Funkcjonalność w tym pakiecie wymaga, aby metoda __main__ była importowalna przez dzieci.Jest to objęte wytycznymi programowania, jednak warto to tutaj wskazać. Oznacza to, że niektóre przykłady, takie jak przykłady wieloprocesorowe nie działa w Interaktywnym tłumaczu. "

+0

Przede wszystkim dziękuję za odpowiedź. To, co zrobiłem, to napisanie kodu w pliku o nazwie "example.py" i naciśnięcie klawisza F5, aby go uruchomić. Może to oznacza "uruchomiony kod w IDLE"? PS: Jestem nowicjuszem z Pythona, więc przepraszam za wszelkie (nadmiernie) oczywiste rzeczy, które mogłem tu przytoczyć. – John

+0

Ach, tak tak IDLE z pytaniem ">>" liczy się jako interaktywny interpreter. W związku z tym, wieloprocesorowość zasadniczo nie zadziała, dopóki nie napiszesz kodu w pliku i nie uderzysz w F5, gdy mówisz lub wpisujesz "python example.py" w wierszu polecenia. Rozumiem, że może to być mylące zagadnienie. Nie ma za co. – manifest

-2

Pobierz PyCharm, miałem ten sam błąd i pracowałem nad nim przez + -5 godzin. W końcu dostałem Pycharm nad Anaconną i otrzymałem wynik. Ma to coś wspólnego z wersją interpretera IPhythona w systemie Windows.

Powiązane problemy