使用可能なCPUがある場合、制御下で複数の「シリアル」プロセスをどのように実行できますか? [コピー]

使用可能なCPUがある場合、制御下で複数の「シリアル」プロセスをどのように実行できますか? [コピー]

maaaaaaaaすべてのファイルで実行する必要があるバイナリがあるとします(ファイル番号が1からNまで指定されているとします)。各ファイルは、このバイナリ(つまり、md5sumなど)を呼び出して処理する必要があります。各実行は結果を別々のファイルに保存します。したがって、1000個のファイルがあり、CPUが4個しかない場合は、次のことをしたくありません(実際には可能ですが)。

i=0; while [ $i -lt 1000 ]; do md5sum a_file_$i > result_$i & i=$(( $i + 1 )); done

(たとえbashが文句を言わなくても)私たちは最終的に1000のプロセスを始め、コンピュータはクロールモードになります。

一度にn個のプロセスのように実行する必要があると言えるコマンドがあります(n個のプロセスを開始し、あるプロセスが完了したら監視し、プロセス数が完了するように別のプロセスを開始します)。走る常にn)?

答え1

牛に似た一種の栄養平行線あなたが探しているツールです。作家、オレデインジャー、ここを定期的に訪問する人であり、いくつかの良い答えを書いています。それに関する質問

xargsfromのGNUバージョンは、複数のfindutilsタスクを並列に実行するためのいくつかのオプションも提供します。あなたのような簡単な作業では使いやすくなるかもしれませんが、それほど良くはありませんparallel

たとえば、

find . -maxdepth 1 -type f -name 'a_file_*' -print0 | 
  xargs -0r -L 1 -P 4 sh -c '/usr/bin/md5sum "$1" > "$1.md5sum"' {}

が実行されますに従ってmd5sum4つのジョブを並列に実行します(-P 4)。また、各ジョブを一度に1つのファイル名で処理するように制限するオプションも使用しました-L 1。それ以外の場合は、1000個のファイル名で1つのジョブのみが実行されます。

関連情報