2012-03-29 27 views
3

我使用哪個寫入輸出的短行用於處理的數據的每個塊的外部過程。我希望在每一行之後做出反應,而不會有任何額外的延遲。但是,似乎ProcessProtocol.outReceived()被緩衝。 Docs狀態:扭曲,ProcessProtocol如何接收不帶緩衝區的標準輸出?

.outReceived(data):調用此過程的數據是從 過程的標準輸出管道接收的。 管道傾向於提供比插座更大的數據塊(一個千字節是常用緩衝區大小),因此,您可能不會遇到網絡套接字典型的「隨機點差和單調」行爲,但無論您應該做好準備如果您的 不能在一次通話中獲得所有數據,請處理。要正確地做到這一點, outReceived應該簡單地積累數據,並推遲做 任何與它,直到處理完畢。

結果是,我在整個處理完成後得到一個塊的輸出。我如何強制ProcessProtocol不緩衝標準輸出?

回答

2

我正在使用外部進程,它爲處理的每個數據塊寫入短行輸出。我希望在每一行之後做出反應,而不會有任何額外的延遲。

的結果是,我得到的輸出在一個塊整個處理完成之後。我如何強制ProcessProtocol不緩衝標準輸出?

緩衝是發生在生產者進程,而不是消費者。標準C庫stdout僅在連接到終端時才進行線路緩衝,否則它是完全緩衝的。這是導致生產者進程以大塊的形式輸出數據的原因,而不是當它沒有連接到終端時逐行輸出數據。

使用stdbuf實用程序強制生產者進程'stdout進行行緩衝。

如果生產者過程是一個Python腳本使用-u python解釋開關完全關閉緩衝的標準流。 stdbuf實用程序雖然更好。

+1

不能直接回答,但肯定其中有明確的指針。正如你所說的,stdout在連接到終端時是行緩衝的,因此使用帶'usePTY = True'的'spawnProcess'解決了這個問題。 – vartec 2012-03-29 15:26:16

+0

我不熟悉扭曲來判斷'usePTY'是否有用。標準C庫使用'isatty()'函數來檢測它是否連接到終端。因此,另一種選擇是'LD_PRELOAD'超級強加'isatty()'的庫以始終返回'1'。 – 2012-03-29 15:30:40

+2

我剛剛檢查過'usePTY'幫助,我正在按我的意願逐行獲取輸出。感謝名單。 – vartec 2012-03-29 15:32:56