stdin上のファイルのリストを処理するタスクがあります。プログラムの起動時間はかなり長く、各ファイルにかかる時間は大きく異なります。これらのプロセスを相当数生成し、ビジーでないプロセスに作業をディスパッチします。私が望んでいることをほとんど実行するいくつかの異なるコマンドラインツールがありますが、私はそれを2つのほぼ機能するオプションに絞り込みました:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
問題はsplit
、純粋なラウンドロビンを実行するため、プロセスの1つが遅れて残り、操作全体の完了が遅れることです。一方parallel
、入力のN行またはバイトごとに1つのプロセスを生成したいので、起動時のオーバーヘッドに多くの時間を費やすことになります。
プロセスを再利用し、標準化されていない標準化されたプロセスにフィードラインを供給するこのようなものはありますか?
myjob
より多くの入力を受け取る準備ができていることを知ることです。プログラムがより多くの入力を処理する準備ができていることを知る方法はありません。あなたが知ることができるのは、どこかのバッファ(パイプバッファ、stdioバッファ)がより多くの入力を受け取る準備ができていることです。プログラムの準備ができたら、何らかのリクエストを送信するように手配できますか(プロンプトを表示するなど)。
read
呼び出しに反応するFUSEファイルシステムがトリックを行います。それはかなり大きなプログラミングの努力です。
-l 1
はparallel
引数で使用していますか?IIRCは、ジョブごとに1行の入力を処理するように指示します(つまり、myjobのフォークごとに1つのファイル名、大量の起動オーバーヘッド)。
split
コマンドはどこから来たのですか?名前が標準のテキスト処理ユーティリティと競合しています。