問題タブ [autoflush]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - Perl で stdout を解析するときのバッファリングを避ける
Perl を使用して、外部プログラム (シェル コマンド) の出力を 1 行ずつ解析したいと考えています。コマンドは継続的に実行されるため、スレッドに配置し、共有変数を使用してメイン ルーチンと通信します。
今まで私のコードは次のように見えます
一部のコマンドでは、これは完全に正常に機能し、行は入力されたとおりに処理されます。出力は次のようになります。
ただし、他のコマンドの場合、これは奇妙な動作をし、行はブロックごとに処理されます。その$var
ため、更新されDebug
ず、しばらく印刷されません。次に、突然、出力は次のようになります (に似ています):
$var
最後/現在の値に設定されます。その後、これが繰り返されます。解析は常に遅延され、ブロック単位で行われますが、途中$var
で更新されることはありません。
まず第一に:パイプを使用する以外に、外部プログラムの出力を(行ごとに)解析するためのより良い/適切な方法はありますか?
そうでない場合、どうすればこの動作を回避できますか?
autoflush(1);
またはを使用$|=1;
すると解決策になる可能性がありますが、「現在選択されている出力チャネル」に対してのみです。私の文脈でそれをどのように使用しますか?
前もって感謝します。
perl - Perl でフラッシュ出力を強制できますか?
Perl には次の 2 行があります。
問題は、Perl スクリプトが入力のために一時停止する前に印刷行が実行されないことです。つまり、Perl スクリプトは明確な理由もなく無期限に停止しているように見えます。出力が何らかの形でバッファリングされていると推測しています (これが \n を挿入した理由ですが、それは役に立たないようです)。
perl - IPC::Open3 はどのように CHLD_IN の autoflush を有効にしますか?
IPC::Open3のドキュメントには次のように記載されています。
しかし、ソースコードには何も言及されていませんIO::Handle::autoflush
。の autoflush をオンにするために、モジュールはどのメカニズムを使用しCHLD_IN
ますか?
java - コンソールへの System.out.print 出力がすぐに表示されます。PrintStream は、println だけでなく、印刷ごとにフラッシュしますか?
PrintStream のドキュメントから:
オプションで、自動的にフラッシュするように PrintStream を作成できます。これは、バイト配列が書き込まれた後、 println メソッドの 1 つが呼び出された後、または改行文字またはバイト ('\n') が書き込まれた後に、 flush メソッドが自動的に呼び出されることを意味します。
次に、与えられたコード
コンソールに出力が表示されるのはなぜですか? これまで何もフラッシュされないため、コンソール(System.out からの PrintStream インスタンス) には何も書き込まれません。
これはこれに答えませんでした。
答えはソース コード (プライベート ユーティリティ メソッド BufferedWriter.flushBuffer()) にあると思いますが、コードへのコメントがわかりません。「ストリーム自体をフラッシュせずに、出力バッファを基になる文字ストリームにフラッシュします」: 「ストリーム自体」である PrintStream (コンソール出力に関連付けられている) がフラッシュされない場合、コンソールへの出力は更新されません!...
PrintStream.print(String) のソース:
BufferedWriter.flushBuffer() のソース:
詳細はこちらにも記載されています。非常に複雑ですが、ある段階で BufferedWriter が PrintStream コンストラクターに渡されるようです。