2014-12-31 11 views
6

Eksperymentowałem z procesami wieloprocesowymi i uruchamiałem blokadę umysłu z demonami.Dlaczego proces demona multipleksowania w języku Python nie drukuje na standardowe wyjście?

Mam jeden demon i jeden proces inny niż demon, demon wysyłający dane wyjściowe co jedną sekundę w nieskończoność, podczas gdy demon nie drukuje danych wyjściowych natychmiast po uruchomieniu, śpi przez 3 sekundy, a następnie drukuje ponownie i wraca.

Problem polega na tym, że oczekiwane wyniki procesu demona nie pojawiają się wcale.

Przeglądanie poprzednich pytań SO na temat demonów, typowe problemy wydają się być albo innymi procesami kończącymi się przed demona, albo stdout wymagającym opróżniania, aby pokazać wynik. Oba mają (I think) zostały zaadresowane, jednak nadal widzę tylko wydrukowane dane z nie-demonicznych procesów.

Kod:

from multiprocessing import Process, current_process 
import sys 
import time 

def worker(): 
    """ 
    Announce that the process has started, sleep 3 seconds 
    then announce that the process is ending. 
    """ 
    name = current_process().name 
    print name, 'starting...' 
    sys.stdout.flush() 

    time.sleep(3) 
    print name, 'ending...' 
    sys.stdout.flush() 

    return 


def daemon(): 
    """ 
    Announce that the process has started, beep, then beep 
    once every second 
    """ 
    name = current_process().name 
    print name, 'starting...' 
    print 'beep...' 
    sys.stdout.flush() 

    while True: 
     time.sleep(1) 
     print 'beep...' 
     sys.stdout.flush() 


if __name__=='__main__': 
    d = Process(target=daemon) 
    d.daemon = True 
    d.start() 

    p = Process(target=worker) 
    p.daemon = False 
    p.start() 

oczekiwany wynik:

Process-1 starting... # Order here may vary 
beep... 
Process-2 starting... 
beep... 
beep... 
Process-2 ending... #There may or may not be another beep here 

Co faktycznie zostanie wyprodukowany:

Process-2 starting... 
Process-2 ending... 

Wszelkie porady dotyczące tego, dlaczego tak się dzieje, byłyby naprawdę mile widziane.

Odpowiedz

4

można uzyskać wyraźniejszy obraz kolejności zdarzeń poprzez włączenie rejestrowania poprzez umieszczenie

import multiprocessing as mp 
logger = mp.log_to_stderr(logging.INFO) 

po innych sprawozdań importowych. Następnie program przyniesie coś takiego:

[INFO/Process-1] child process calling self.run() 
[INFO/MainProcess] process shutting down 
Process-1 starting... 
beep... 
[INFO/Process-2] child process calling self.run() 
[INFO/MainProcess] calling terminate() for daemon Process-1 
Process-2 starting... 
[INFO/MainProcess] calling join() for process Process-2 
Process-2 ending... 
[INFO/Process-2] process shutting down 
[INFO/Process-2] process exiting with exitcode 0 
[INFO/MainProcess] calling join() for process Process-1 

Zatem głównymi zaczyna zamykając pierwszy, to kończy Process-1, procesu demona. Dlatego nie widać więcej sygnałów dźwiękowych podczas trwania procesu 2.

+0

Ah Widzę, demon zostaje zakończony, gdy kończy się główny proces, a nie gdy kończą się wszystkie procesy potomne. Ma sens, wielkie dzięki! Przypuszczam, że dodanie p.join() na końcu głównego procesu sprawi, że będzie czekać na zakończenie nie-demona. – zehnpaard