2016-08-04 7 views
0

In Python3 erstelle ich verzweigte untergeordnete Prozesse, die ich - ich denke - richtig beenden. Hier ist ein Code Beispiel:Wie zu vermeiden, dass Prozesse mit Python Fork?

import os 

child_pid = os.fork() 
if child_pid == 0: 
    print("I am in the child with PID "+str(os.getpid())) 
    # doing something 
    a = 1+1 
    print("Ending child with PID "+str(os.getpid())) 
    os._exit(0) 
else: 
    #parent process  
    os.waitpid(-1, os.WNOHANG) 
    import time 
    for x in range(100): 
     time.sleep(1) 
     print("waiting...")           

Jetzt, da das Kind Prozess beendet zu werden scheint, es kann immer noch als ‚nicht mehr existierender‘ Prozess gesehen werden (während des übergeordneten Prozess noch läuft). Wie man den beendeten Kindprozess wirklich los wird? Wie ändere ich den Code?

+0

Durch verstorben meinst du es ist ein Zombie-Prozess? Ihr Elternteil muss auf das Kind warten, um seinen Status zu erhalten, dann wird es verschwinden. Siehe http://stackoverflow.com/questions/13870945/how-cani-i-prevent-a-child-process-to-not-become-a-zombie-if-parent-exits – pcarter

+0

Ersetzen von 'os._exit (0) 'by' sys.exit (0) 'ändert nichts an der Situation. Und das Hinzufügen eines Befehls "os.waitpid (-1, os.WNOHANG)" im übergeordneten Prozess ändert die Situation nicht. Ein "verstorbener" Prozess existiert noch! – Alex

+0

@pcarter: Siehe meinen Befehl, Ihr Vorschlag scheint nicht zu funktionieren ... – Alex

Antwort

1

Sie können das Doppelgabel-Idiom verwenden, wenn Sie nicht möchten, dass das übergeordnete Element wartet. (Siehe What is the reason for performing a double fork when creating a daemon?)

Die Grundidee für den übergeordneten Prozess ist (nennen wir es P) ein Kind gabeln (C1), die sofort Gabeln wieder ein anderes Kind zu erstellen (C2) und beendet dann. In diesem Fall erbt der init Prozess und wartet auf Sie, da das übergeordnete Objekt C2 tot ist. Sie müssen immer noch auf C1 in der P Prozess warten oder C1 wird ein Zombie sein. Allerdings läuft C1 nur für eine sehr kurze Zeit, so dass der P Prozess nicht lange warten wird. Ihr Code, der C2 läuft, kann dann so viel Zeit nehmen, wie er will und es ist egal, ob es vor oder nach P endet.

Eine andere Idee ist, das SIGCHILD-Signal zu behandeln, das auftritt, wenn ein Kind beendet wurde. Von https://mail.python.org/pipermail/tutor/2003-December/026748.html

import os,signal 

def handleSIGCHLD(): 
    os.waitpid(-1, os.WNOHANG) 

signal.signal(signal.SIGCHLD, handleSIGCHLD) 
+0

Interessante Idee. Werde es später versuchen, danke ... – Alex

Verwandte Themen