常に「x」インスタンスを並行して実行したいスクリプトがあります。
コードは次のようになります。
for A in
do
for B in
do
(script1.sh $A $B;script2.sh $A $B) &
done #B
done #A
スクリプト自体がDBクエリを実行するため、並列実行のメリットがあります。問題は
1)「待機」は機能しません(すべてのバックグラウンドジョブを終了し、新しいジョブを開始するため(スレッドカウンターを含めても)、多くの時間を浪費します。
2)それを並行して行う方法がわかりませんでした。同じスクリプトが複数回実行される例のみが見つかりましたが、パラメーターが異なる場合は見つかりませんでした。
3)代替ソリューションは次のようになります。
for A in
do
for B in
do
while threadcount>X
do
sleep 60
done
(script1.sh $A $B;script2.sh $A $B) &
done #B
done #A
しかし、スレッド数を信頼できるものにする方法がわかりませんでした。
正しい方向へのいくつかのヒントは大歓迎です。
並列を使用したいのですが、ドキュメントに記載されているように機能しません。
私がやります
parallel echo ::: A B C ::: D E F
(ドキュメントから)そしてそれは私に教えてくれます
parallel: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
これは、マニュアルページの最も単純な例にすぎません。
GNU Parallelを使用すると、次のようになります。
parallel script1.sh {}';' script2.sh {} ::: a b c ::: d e f
CPUごとに1つのジョブを生成します。
GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。多くの場合、for
ループを置き換えることができます。
4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。
インストール
GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで10秒で実行できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。
詳細
その他の例を参照してください: http://www.gnu.org/software/parallel/man.html
イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるためにメーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel
Xargsでこれを行うことができると思います:
for A in a b c
do
for B in d e f
do
echo $A $B; done; done | xargs -I {} -P4 bash -c "script1.sh {}; script2.sh {}"
-P4は、4つのインスタンスを並行して実行するように指示しています。そのための値を指定する必要があります。