Python unter Windows - Wie kann ich auf mehrere untergeordnete Prozesse warten?
Wie zu warten, bis mehrere Kind-Prozesse in Python unter Windows, ohne aktives warten (polling)? So etwas fast funktioniert bei mir:
proc1 = subprocess.Popen(['python','mytest.py'])
proc2 = subprocess.Popen(['python','mytest.py'])
proc1.wait()
print "1 finished"
proc2.wait()
print "2 finished"
Das problem ist, dass wenn proc2
beendet, bevor proc1
, der übergeordnete Prozess wird noch warten proc1
. Unter Unix würde man mit waitpid(0)
in einer Schleife, um die Kind-Prozesse " return-codes, wie Sie beenden - wie um etwas zu erreichen, wie dies in Python auf Windows?
Kommentar zu dem Problem - Öffnen
können Sie beschreiben, waitpid(0), die Sie verwenden würden, auf unix?
docs.python.org/library/os.html#os.waitpid
waitpid(0)
auf unix-wartet (es sei denn, WNOHANG
ist in der option) für jeden Kind-status und liefert (Prozess-id,status)
- Tupel. InformationsquelleAutor der Frage Rafał Dowgird | 2008-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es scheinen übertrieben, aber hier geht es:
InformationsquelleAutor der Antwort tzot
Verdreht hat eine asynchroner Prozess -, Laich-API die funktioniert auch auf Windows. Es gibt tatsächlich mehrere verschiedene Implementierungen, von denen viele nicht so toll, aber man kann zwischen Ihnen wechseln, ohne änderung des Codes.
InformationsquelleAutor der Antwort Glyph
Gebäude auf zseil Antwort, Sie können dies tun mit einer Mischung von Teilprozess und win32-API-Aufrufe. Ich benutzte gerade ctypes, da meine Python nicht passieren, win32api installiert. Ich bin gerade laichen sleep.exe von MSYS hier als Beispiel, aber klar könnten Sie laichen jeden Prozess, den Sie möchten. Ich benutze OpenProcess (), um ein HANDLE vom Prozess " PID, und dann WaitForMultipleObjects-warten auf die Prozess fertig zu stellen.
InformationsquelleAutor der Antwort Ted Mielczarek
Verdreht unter Windows ausgeführt werden wird, ein aktives warten, unter der Decke. Wenn Sie nicht möchten, verwenden Sie threads, verwenden Sie die win32-API zu vermeiden polling. So etwas wie dieses:
InformationsquelleAutor der Antwort user23475
Können Sie psutil:
'Weg' und 'lebendig' sind Listen anzeigt, welche Prozesse gegangen sind und welche noch am Leben sind.
Optional können Sie einen callback, die aufgerufen wird jedes mal, wenn eine der überwachten Prozesse beendet:
InformationsquelleAutor der Antwort Giampaolo Rodolà