非ブロック/マルチスレッド猫

非ブロック/マルチスレッド猫

cat私が見たことをブロックしました。パスワードread()つまり、ブロックを使用してからブロックを使用しますwrite()

すべての標準出力バッファリングが目的に応じて無効になっているいくつかのツールを呼び出したいです(例:説明されているように)。ここ)、ツールが子プロセスを呼び出すことができ、同時に作成される場合、すべての子プロセスによるstdoutのすべての書き込みが同時に発生したいからです。

cat次に、対応する標準出力をマルチスレッドバージョン(または同様のもの)にパイプしたいと思います。意図は実際のstdoutが遅くなることです(ディスクのファイルです)。しかし、stdoutに書き込もうとしたときにツールが停止したくありません。もし欲しいなら

stdbuf -oL mytool

その後、ディスクが使用中の場合は停止します。私がするとき

stdbuf -oL mytool | cat

私は実際に何を期待すべきか完全にはわかりません。追加のバッファリングを受け取ることもできます。カーネルパイプバッファ、stdoutバッファリングを無効にすると使用されないと思いますmytool。その後、デフォルトではstdoutもバッファリングされますが、実際にstdoutに書き込むと中断される可能性catがあります。何かを書くと止まりますが、同時に読みません。catmytoolcat

catこれが私が書いている間に同時に読み取るマルチスレッドを探している理由です。したがって、stdinに書き込むmulti-threaded-catことは絶対にブロックされません(または単にソフトブロックまたは何と呼ぶか​​)。デフォルトではstdoutに書き込もうmulti-threaded-catとすると停止しますmulti-threaded-cat。 stdinから並列に読み取るので問題ありません。だから私はしたいと思います:

stdbuf -oL mytool | multi-threaded-cat

multi-threaded-cat私はいつも着信データをできるだけ早く消費したいと思います。だからマルチスレッドになるべきだと思います。それ以外の場合、write()を使用するとブロックまたは最小限の問題が発生する可能性があり、同時にstdinでread()を実行することはできません。

multi-threaded-catまたすぐにデータを書きたいです。したがって、独自のバッファを最初に書き込んでから書き込まないでください。常にすぐに書き込んでください。

私のユースケースは次のとおりです。いくつかのサブプロセスを含むmytoolは、標準出力にいくつかのログ情報を記録します。stdbuf出力が遅れることなく、すべての子プロセスの標準出力が同期されることが重要です。すべての標準出力はファイルサーバーのログファイルにリダイレクトされます。これは少し遅く、すべての書き込みが完了するのを待っている間にパフォーマンスが大幅に低下します。だから私はmulti-threaded-catその間に何かが欲しかった。

そのようなツールがありますか?

私はこのような独自のツールを実装しました。ここ。それを使用すると、使用しないものに比べて速度が800%向上しました。しかし、私が望むことを行うことができる他のツールや他の方法がありますか?

ベストアンサー1

「マルチスレッド」は実装の詳細であり、実際には必要ではありません。マルチスレッドcat実装は依然としてブロックされている可能性があり、あるスレッドは読み取っているデータを入れる場所を待っているため、別のスレッドを待っています。あなたが探しているもの非遮断 cat、潜在的に無制限のバッファがあります。

このspongeユーティリティは以下で提供されます。Joey Hessのmoreutilsこれは極端なバージョンです。まず、ファイル全体をメモリに読み込み、出力を書き込みます。これはあなたに効果があるかもしれませんし、そうでないかもしれません。

pvバッファサイズを指定できます。無限のバッファを持つことはできませんが、非常に大きな最大サイズ(必要に応じてメモリと同じくらい大きい)を設定でき、バッファは必要な場合にのみ割り当てられます。

stdbuf -oL mytool | pv -q -B 1g >output-file

おすすめ記事