Vermeiden müssen Teilprozess Deadlocks ohne Kommunikation
Ich brauche einen Befehl ausführen, die eine größere Ausgabe erzeugt und nimmt eine Menge Zeit zum ausführen (> 30 Minuten). Ich war denken mit subprocess.Popen, es zu tun. Ich muss erfassen Sie die Ausgabe des Befehls, so passiere ich die PIPE auf stdout und stderr.
Einer deadlock-problem bei der Verwendung Popen.wait() ist gut dokumentiert, die auf eine Menge von Foren, so Popen.kommunizieren() ist der vorgeschlagene Weg, um die deadlock. Das problem bei dieser Lösung ist, dass die Kommunikation() blockiert, bis der Befehl abgeschlossen ist. Ich brauche, um zu drucken, alles, was ankommt, auf stdout aus, während der Befehl ausgeführt wird. Wenn es gibt keine Ausgabe nach 20 Minuten, die Skript-Ausführung wird getötet werden.
Hier sind einige Einschränkungen, die ich beachten müssen:
- Meine Python-version ist 2.4.2 und ich kann nicht aktualisieren.
- Wenn die Lösung noch verwenden Teilprozess, muss ich weiterleiten Teilprozess.ROHR für alle std-Griffe zu vermeiden, diese Fehler: http://bugs.python.org/issue1124861
Gibt es einen Weg, es zu tun?
- (Von google?) alle Rohre werden deadlock, wenn eines der Rohre Puffer gefüllt wird, und nicht gelesen. z.B. stdout deadlock, wenn stderr gefüllt ist. Nie ein ROHR, Sie wollen nicht Lesen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
stdin
zu einemNUL
GerätHaben Sie versucht,pexpect?
Es klingt wie Sie tun müssen, um eine non-blocking read auf die filehandles auf den Rohren angebracht.
Dieser Frage geht es um einige Möglichkeiten, das zu tun, für windows & linux: Non-blocking read auf einen Teilprozess.ROHR in python
Zur Vermeidung der pipe-Puffer Auffüllen, starten Sie einfach einen hintergrund-thread in der parent-Prozess. Das Gewinde kann entweder einfach kontinuierlich Lesen von stdout (und stderr) zum halten der pipe-Puffer aufgefüllt wird, oder Sie rufen
communicate()
aus. So oder so, der main-thread ist frei, auch weiterhin mit der gewöhnlichen Verarbeitung und der Kind-Prozess wird nicht blockiert, die auf eine output-operation.Konvertierung synchroner IO-Betrieb in einen asynchronen man (aus der Sicht der Haupt-thread) ist eines der besten Anwendungsfälle für die threads. Auch asynchrone frameworks wie Twisted manchmal verwenden Sie es als letzten Ausweg Lösung, wenn keine native asynchrone Schnittstelle ist für einen bestimmten Vorgang.
Könnten Sie erwägen, die Verwendung von mehreren threads. Zuweisen eines thread zu Lesen von stdout, eine von stderr, und verwenden Sie eine Dritte thread zu erkennen, die timeout: