Wann soll ich `warten` anstelle von `kommunizieren` in Teilprozess?
In das Dokument warten (http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait), es sagt:
Warnung
Diese wird deadlock bei der Verwendung von stdout=PIPE und/oder stderr=PIPE und die
Kind-Prozess erzeugt genug Leistung, um ein Rohr, so dass es blockiert
warten auf die OS-pipe-buffer zu akzeptieren, mehr Daten. Verwenden Sie kommunizieren()
um zu vermeiden, dass.
Ich denke communicate
ersetzen könnte alle Verwendung von wait()
wenn retcode
ist nicht nötig. Und selbst wenn die stdout
oder stdin
sind nicht PFEIFE, kann ich die auch ersetzen wait()
durch communicate()
.
Ist das richtig? Danke!
communicate
ist eine bequeme Methode, hinter der sich die Plattform-abhängigen details Lesen/schreiben, um die Rohre mit poll, wählen Sie, oder threads (Windows). Es fordertwait
am Ende. Verwenden Sie, wenn es Ihren Bedürfnissen entspricht, aber eine komplexere pipeline erfordern möglicherweise die Handhabung der Rohre manuell, oder verwenden Sie ein intermediatewait
.- Wird
wait()
's performance besser sein, alscommunicate()
? - Ich kann mir vorstellen, eine situation wo Sie sich entscheiden, schließen Sie die Rohre an den Unterprozess, bevor es beendet wurde. Wenn (später) Sie wollen sicherstellen, dass es abgeschlossen ist, wird eine wait() arbeiten, aber nicht kommunizieren(), weil es verwirrt von der bereits geschlossenen Rohre.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute (die docs nicht ausdrücklich als 2.6) in dem Fall, wo Sie nicht Pfeifen kommunizieren() wird reduziert zu wait(). Also, wenn Sie nicht Rohre sollte es OK sein, Sie zu ersetzen wait().
In dem Fall, wo Sie tun Rohre können Sie überlauf-Speicher-Puffer (siehe kommunizieren() Hinweis:) genauso, wie Sie Sie füllen können-OS-pipe-buffer, also entweder man ist nicht zur Arbeit zu gehen, wenn man sich mit viel Leistung.
Auf eine praktische note, die ich hatte, zu kommunizieren (zumindest in der 2.4) gib mir ein Zeichen pro Zeile von Programmen, deren Ausgang line-basierte, das war nicht nützlich, um es milde auszudrücken.
Außerdem, was meinst du mit "retcode wird nicht benötigt"? - Ich glaube, es setzt Popen.returncode einfach als wait() tut.