Teilprozess.wait() wartet nicht auf Popen Prozess zu beenden (bei der Verwendung von threads)?
Ich bin erleben einige Probleme bei der Verwendung von subprocess.Popen()
zum laichen mehrere Instanzen der gleichen Anwendung aus meinem python-Skript mit threads zu haben, die Sie gleichzeitig laufen. In jedem thread habe ich die Anwendung ausführen, mit der popen()
rufen, und dann muss ich warten, bis es zu beenden durch Aufrufwait()
. Das problem scheint zu sein, dass die wait()
-Aufruf nicht eigentlich warten, bis der Prozess abgeschlossen ist. Ich experimentierte mit nur einem thread, und durch das drucken von text-Nachrichten, wenn der Prozess beginnt, und Wann es beendet ist. Also die thread-Funktion würde wie folgt Aussehen:
def worker():
while True:
job = q.get() # q is a global Queue of jobs
print('Starting process %d' % job['id'])
proc = subprocess.Popen(job['cmd'], shell=True)
proc.wait()
print('Finished process %d' % job['id'])
job.task_done()
Aber selbst wenn ich nur ein thread, es gibt mehrere "Starten..." - Nachrichten, bevor irgendwelche "Fertig-Prozess..." - Meldung erscheint. Gibt es Fälle, wenn wait()
eigentlich nicht warten? Ich habe mehrere verschiedene externe Anwendungen (C++ - Konsolenanwendungen), die wiederum mehrere Instanzen gleichzeitig laufen, und für einige von Ihnen, mein code funktioniert, aber für andere ist es nicht. Könnte es sein, einige Problem mit der externen Anwendungen, die irgendwie wirkt der Aufruf wait()
?
Der code für das erstellen des threads so aussieht:
for i in range(1):
t = Thread(target=worker)
t.daemon = True
t.start()
q.join() # Wait for the queue to empty
Update 1:
Ich sollte auch hinzufügen, dass für manche der externen Anwendungen manchmal bekomme ich einen Rückgabewert (proc.returncode
) -1073471801. Zum Beispiel, eine der externen Anwendungen geben, dass der return-code die ersten beiden Male Popen
genannt wird, aber nicht die letzten zwei (wenn ich vier jobs).
Update 2:
Klar, die Dinge bis jetzt habe ich vier jobs in der Warteschlange, das sind vier verschiedene Testfälle. Wenn ich meinen code für eines der externen Anwendungen die ersten zwei Popen
-Anrufe generieren, die die Rückkehr-code -1073471801. Aber wenn ich drucken Sie die genauen Befehl, die Popen
Anrufe, und führen Sie es in einem command-Fenster hat, führt er ohne jegliche Probleme.
Gelöst!
Ich schaffte es um die Probleme zu lösen, die ich hatte. Ich denke, das problem war meine mangelnde Erfahrung in der Thread-Programmierung. Ich vermisste die Tatsache, dass, wenn ich hatte meine erste worker-threads, würden Sie weiterleben, bis Sie das python-Skript beendet. Versehentlich habe ich mehr worker-threads jedes mal, wenn ich neue Elemente in der Warteschlange (ich weiß, dass in den Reihen für jedes externe Programm, das ich ausführen will). So durch die Zeit habe ich im vierten externen Anwendung, hatte ich vier threads gleichzeitig ausführen, obwohl ich nur dachte, ich hatte eine.
InformationsquelleAutor der Frage iceaway | 2011-06-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie auch
check_call()
statt Popen.check_call()
wartet, bis der Befehl fertig, auch wennshell=True
und dann gibt den exit-code des Jobs.InformationsquelleAutor der Antwort Nick
Traurig, wenn Sie mit Ihrem Teilprozess mit
shell=True
wait(
) nur warten, bis diesh
Unterprozess zu beenden, und nicht für den Befehlcmd
.Werde ich vorschlagen, wenn es möglich ist, verwenden Sie nicht die
shell=True
wenn es nicht möglich ist, können Sie einen Prozess erstellen Gruppe wie in diesem Antwort und verwenden os.waitpid zu warten, für die Prozess-Gruppe nicht nur die shell-Prozess.Ich hoffe, das war hilfreich 🙂
InformationsquelleAutor der Antwort mouad
Stellen Sie sicher, dass alle Anwendungen, die Ihrem Aufruf gültige system Rückkehr-codes, wenn Sie fertig sind
InformationsquelleAutor der Antwort Chakib
Ich hatte Probleme als gut, aber wurde von dir inspiriert.
Meins sieht so aus und funktioniert wunderbar:
Feststellen, das versteckt das Fenster auch.
InformationsquelleAutor der Antwort alfadog67