2012-03-29 6 views
3

Ich verwende einen externen Prozess, der eine kurze Ausgabezeile für jeden verarbeiteten Datenblock schreibt. Ich möchte nach jeder dieser Zeilen ohne zusätzliche Verzögerung reagieren. Allerdings scheint .outReceived() von ProcessProtocol gepuffert zu sein. Docs Zustand:Twisted, wie kann ProcessProtocol stdout ohne Pufferung erhalten?

.outReceived (Daten): Diese wird mit Daten aufgerufen, die von dem Prozess stdout Rohr empfangen wurde. Pipes neigen dazu, Daten in größeren Chunks als Sockets (1 Kilobyte ist eine gemeinsame Puffergröße), so dass Sie Mai nicht das "zufällige Dribs and Drabs" Verhalten typisch von Netzwerk-Sockets zu liefern, aber unabhängig davon sollten Sie vorbereitet sein Deal, wenn Sie nicht alle Ihre Daten in einem einzigen Anruf erhalten. Um es richtig zu machen, outReceived sollte einfach die Daten akkumulieren und alles damit zu verschieben, bis der Prozess abgeschlossen ist.

Das Ergebnis ist, dass ich in einem Stück nach der gesamten Verarbeitung ausgegeben wird. Wie kann ich ProcessProtocol zwingen, stdout nicht zu puffern?

Antwort

2

Ich verwende externen Prozess, der kurze Zeile der Ausgabe für jeden Teil der verarbeiteten Daten schreibt. Ich möchte nach jeder dieser Zeilen ohne zusätzliche Verzögerung reagieren.

Das Ergebnis ist, dass ich in einem Stück ausgegeben werde, nachdem die gesamte Verarbeitung abgeschlossen ist. Wie kann ich ProcessProtocol zwingen, stdout nicht zu puffern?

Die Pufferung findet im Herstellerprozess statt, nicht beim Verbraucher. Die Standard-C-Bibliothek stdout wird nur an der Leitung gepuffert, wenn sie an ein Terminal angeschlossen ist, andernfalls ist sie vollständig gepuffert. Dies führt dazu, dass der Producer-Prozess Daten in großen Blöcken anstatt Zeile für Zeile ausgibt, wenn er nicht mit einem Terminal verbunden ist.

Verwenden Sie das Dienstprogramm stdbuf, um den Producer-Prozess stdout zu erzwingen, damit er zwischengespeichert wird.

Wenn der Producer-Prozess ein Python-Skript ist, verwenden Sie den Python-Interpreter-Schalter -u, um die Pufferung der Standard-Streams vollständig zu deaktivieren. stdbuf Dienstprogramm ist jedoch besser.

+1

Nicht direkt eine Antwort, aber sicher enthält einen klaren Zeiger darauf. Wie Sie gesagt haben, ist stdout bei der Verbindung mit dem Terminal liniengepuffert, also wurde 'spawnProcess' mit' usePTY = True' gelöst. – vartec

+0

Ich bin nicht vertraut mit verdreht zu sagen, ob 'UsePTY' nützlich ist. Die Standard-C-Bibliothek verwendet die 'isatty()' -Funktion, um festzustellen, ob sie mit einem Terminal verbunden ist. Daher ist eine weitere Option, eine Bibliothek zu "LD_PRELOAD", die "isatty()" übersteuert, um immer "1" zurückzugeben. –

+2

Ich habe gerade überprüft und 'UsePTY' geholfen, ich bekomme meine Ausgabe Zeile für Zeile, wie ich es wollte. Danke. – vartec