GNU parallel のドキュメントには、シェルから並列にジョブを実行できるプログラムの完全なリストがあり、それらの比較も含まれています。そこには非常に多くの解決策があります。もう 1 つの良いニュースは、ジョブのスケジューリングが非常に効率的であるため、すべてのコア/プロセッサが常にビジー状態に保たれることです。
並行して実行するには、シェル コマンドの最後に「&」を使用してバックグラウンドで実行し、次に wait
を使用します。 デフォルトでは (つまり、引数なしで)、すべてのバックグラウンド プロセスが終了するまで待機します。したがって、10 を並行して開始し、待ってから、別の 10 を実行します。これは、2 つのネストされたループで簡単に実行できます。
これを行うもう 1 つの非常に便利な方法は、gnu parallel を使用することです。これは、まだ持っていない場合はインストールする価値があります。これは、タスクに必ずしも同じ時間がかかるとは限らない場合に非常に役立ちます。
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
./myrun 1
を起動します 、 ./myrun 2
など、一度に 8 つのジョブが実行されていることを確認します。 PBS ジョブなどで一度に複数のノードで実行したい場合は、ノードのリストを取得することもできます。私たちのシステムでそれを行う方法についてのユーザーへの指示はここにあります。
以下を追加して更新: moreutils パッケージに含まれる同じ名前のより制限されたユーティリティではなく、gnu-parallel を使用していることを確認する必要があります (この 2 つの相違点については、ここで説明します)。
bash サブシェルを確認してください。これらは、スクリプトの一部を並行して実行するために使用できます。
私はこれをテストしていませんが、これが出発点になる可能性があります:
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait