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.
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