我有一個腳本,其輸出被輸送到less
,我希望腳本在它們出現時將其打印到less
中,而不是一次全部打印出來。每次打印後沖洗標準輸出的含義
我發現,如果在每次打印後刷新stdout(通過sys.stdout.flush()
),刷新(顯然)時,該行將顯示在less
中。
我的問題是:這樣做有什麼缺點嗎?我的腳本有數十萬行正在打印,會在每行導致問題後沖洗?
我的印象是肯定的,因爲你需要額外的資源了,每次顯示你齊平,以及完全規避緩衝輸出
我有一個腳本,其輸出被輸送到less
,我希望腳本在它們出現時將其打印到less
中,而不是一次全部打印出來。每次打印後沖洗標準輸出的含義
我發現,如果在每次打印後刷新stdout(通過sys.stdout.flush()
),刷新(顯然)時,該行將顯示在less
中。
我的問題是:這樣做有什麼缺點嗎?我的腳本有數十萬行正在打印,會在每行導致問題後沖洗?
我的印象是肯定的,因爲你需要額外的資源了,每次顯示你齊平,以及完全規避緩衝輸出
的想法基本上,唯一的缺點是,它可能更慢。 stdin上的緩衝允許你的程序在慢速的物理I/O之前運行。
但是,如果您發送的數量較少,則無論如何都要以人工速度運行 - 這不會有什麼區別。
除非用戶在拖尾模式下使用'less',否則該工具不需要打印所有內容,直到用戶向下滾動才能看到它,所以通過強制程序以較小的塊寫入'less',您總吞吐量下降。也許不是那麼多,但是我沒有發現這裏提出的論點(使用將輸出緩存到用戶的程序意味着將輸出寫入程序的速度沒有實際意義)。如果用戶只是搜索輸出錯誤(使用'/'或類似的設施),而不是以人工速度讀取每條線,則總吞吐量很重要。 –
不是太多,可能甚至不明顯。 –
取決於細節,就像在所有的事情。我可能會構建一個重要的病態案例 - 如果您正在使用同步標記裝入文件系統,或者如果系統在中斷負載下已經陷入困境 - 但已被授予,則這些情況都是特例情況。 –
Python可以被告知自動刷新一切。我會考慮利用這一點,而不是讓代碼更長。 –
請參閱Python解釋器的'-u'參數和'PYTHONUNBUFFERED'環境變量;都記錄在https://docs.python.org/2/using/cmdline.html –
@CharlesDuffy感謝您的提示,我會研究它! – Jeeter