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?
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
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. –
Ich habe gerade überprüft und 'UsePTY' geholfen, ich bekomme meine Ausgabe Zeile für Zeile, wie ich es wollte. Danke. – vartec