2009-06-13 11 views
1

Ich habe eine C++ - Anwendung mit bestimmten Elementen in einer Warteschlange, diese Elemente werden dann von einem Python-Skript verarbeitet werden. Ich will es so, dass maximal 10 Instanzen des Python-Skripts laufen. Ich plane mit execl() den Python-Prozess zu starten. Gibt es eine Möglichkeit zu sagen, dass der Prozess beendet wurde, ohne eine Nachricht an den übergeordneten Prozess zurückgeben zu müssen?sagen, wenn ein execl() Prozess beendet

Antwort

5

execl startet keinen Prozess - es überlagert den vorhandenen Prozess mit einer anderen ausführbaren Datei. forkstartet startet einen Prozess - und gibt die ID des untergeordneten Prozesses (alias pid) an den übergeordneten Prozess zurück (gibt 0 an den untergeordneten Prozess zurück, so weiß das Kind, dass es das Kind ist, damit es die Dinge aufräumen kann und exec). Verwenden Sie die pid der Kinder, um zu überprüfen, ob sie fertig sind oder nicht, oder fangen Sie SIGCHLD ab, um das zu verfolgen.

Ich empfehle die SIGCHLD, so dass Sie müssen nicht „Umfrage“, um zu sehen, ob irgendein Prozess beendet hat, aber dieser Ansatz ist nicht zu hart, entweder - nur einmal ausgeführt in einer Weile:

def whosdone(pids): 
    nope = [] 
    done = [] 
    for pid in pids: 
     try: os.kill(pid, 0) 
     except OSError: nope.append(pid) 
     else: done.append(pid) 
    return done, nope 

dh Sie können in regelmäßigen Abständen done, pidslist = whosdone(pidslist) aufrufen und alles tun, was Sie tun müssen, um die PIDs zu erledigen. Natürlich, wenn Sie fork, das Idiom verwenden:

pid = os.fork() 
if pid: # we're the parent process 
    pidslist.append(pid) 
else: # we're the child process 
    # clean things up, etc, then exec 
+0

Möchten Sie, wie man erweitern können, die Kinder PIDs zu überprüfen, ob sie fertig zu überprüfen? Ich verstehe nicht, wie das würde mir sagen, wenn ihre fertig oder nicht – whatWhat

+0

os.kill (pid, 0) löst eine OSError Ausnahme, wenn Prozess pid beendet wurde (oder ist im Besitz eines anderen Benutzers), keine Ausnahme, wenn pid für die läuft aktueller Benutzer - kein anderer Effekt. Lassen Sie mich dort meine Antwort bearbeiten ... –

+0

Wäre es nicht besser, os.wait (0, os.WNOHANG) zu verwenden? Dadurch wird der untergeordnete Prozess erfasst, ein Ressourcenleck wird entfernt und es wird vermieden, dass jedes Kind durchlaufen wird. – bdonlan

Verwandte Themen