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 fordert wait 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 intermediate wait.
  • Wird wait()'s performance besser sein, als communicate()?
  • 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.
InformationsquelleAutor Hanfei Sun | 2012-11-23
Schreibe einen Kommentar