2012-04-13 3 views
2

Ich habe mehrere Fragen wie diese gesehen, aber nach dem Versuch, verschiedene Varianten zu überprüfen, ob die Kinder leben und die Kinder Prozesse beenden, vereinfachte ich das Problem und noch wird es nicht funktionieren.Python gegabelte Prozesse werden nicht sterben

Bin ich falsch beim Beenden eines gegabelten Prozesses mit sys.exit (0)? Gibt es eine andere Möglichkeit, es zu töten. Die Sache ist, ich kann nicht die Eltern die Prozesse töten lassen, da sie nicht wissen, wann sie fertig sind.

Zuerst dachte ich, es war, weil ein Systembefehl vor dem Beenden ausgeführt (Python run system command and then exit... won't exit), aber ich habe sogar, dass in der vereinfachten Version als gegebene Lösung auch nicht entfernt.

Hier ist ein Beispiel:

import sys 
import os 
import time 

children = [] 

for i in range(0,3):  
    pid = os.fork() 

    if pid == -1: 
     continue 
    elif pid == 0: 
     # Do work... 
     print 'Child %d spawned' % os.getpid() 
     sys.exit(0)  
    else: 
     children.append(pid) 

time.sleep(5) 
for pid in children: 
    proc_path = '/proc/%d' % pid 
    if not os.path.exists(proc_path): 
     print 'Child %d is dead' % pid 
    else: 
     print 'Child %d is alive' % pid 

Diese Drucke:

Child 27636 spawned 
Child 27637 spawned 
Child 27638 spawned 
Child 27636 is alive 
Child 27637 is alive 
Child 27638 is alive 

Aber Kind Prozesse sollten tot sein.

Wodurch werden diese Prozesse in diesem Fall zu Zombies?

Antwort

4

Sie müssen wait() für den Kind-Prozess.

Bitte fügen Sie folgende Zeilen Dinge zu bekommen korrigiert:

import sys 
import os 
import time 

children = [] 

for i in range(0,3):  
    pid = os.fork() 

    if pid == -1: 
     continue 
    elif pid == 0: 
     # Do work... 
     print 'Child %d spawned' % os.getpid() 
     sys.exit(0)  
    else: 
     children.append(pid) 

time.sleep(5) 

# ADD NEXT TWO LINES: 
for pid in children: 
    os.waitpid(pid, 0) 

for pid in children: 
    proc_path = '/proc/%d' % pid 
    if not os.path.exists(proc_path): 
     print 'Child %d is dead' % pid 
    else: 
     print 'Child %d is alive' % pid 

Der Elternteil muss wait() für das Kind. Einzelheiten finden Sie unter man 2 wait. In Python können Sie diese Dinge mit dem subprocess Modul umgehen.

+0

Danke. Das funktioniert, ich muss etwas mehr Logik hinzufügen, aber das ist in Ordnung. – JayLev

2

Damit das Kind von der PID-Tabelle verschwindet, benötigen Sie wait() auf der Seite der Eltern.

n_still_children_alive = len(children) 
while n_still_children_alive > 0: 
    pid, status = os.wait() 
    print "Child %d died and joined" % pid 
    n_still_children_alive -= 1 

Wenn Sie mit Multiprocessing in Python spielen, um wollen, sind Sie viel besser von multiprocessing module anstelle des Abrufens mit os Modul.

+0

Danke. Ich verwende normalerweise Multiprocessing, weshalb ich dieses Problem nie hatte. Aber jetzt bin ich mit Python 2.5 festgefahren. – JayLev

Verwandte Themen