私が作成したPythonツールを使用していくつかのシミュレーションを実行したいと思います。問題は、他の引数/パラメータとすべての項目を使用して複数回呼び出す必要があることです。
現在、次のタスクを実行するために複数のループを使用していますfor
。
for simSeed in 1 2 3 4 5
do
for launchPower in 17.76 20.01 21.510 23.76
do
python sim -a $simSeed -p $launchPower
done
done
シミュレーションを同時に実行するために&
シミュレータを呼び出す行の末尾にを追加しました。
python sim -a $simSeed -p $launchPower &
この方法では、これらの急流を複数実行できます。しかし、私のコンピュータのメモリは限られているので、上記のスクリプトを書き換えて内部for
ループを並列に開始し、外部ループを順次起動したいと思いますfor
。
simSeed = 1
たとえば、5つの異なるプロセスを同じように実行したいとします。この部分が完了したら、5つの異なる並列プロセスを使用してスクリプトを再実行したいと思います。launchPower
17.76 20.01 21.510 23.76
simSeed = 2
launchPower
17.76 20.01 21.510 23.76
これをどのように実行できますか?
要約:
外側のループは順次実行され、内側のループは並列に実行され、内側のループの最後の並列プロセスが完了したら、外側のループが次の反復に移動することを望みます。
答え1
GNU Parallelには、タスクを並列に開始するときにリソースの使用を制限するいくつかのオプションがあります。
2つのネストされたループの基本的な使用法は次のとおりです。
parallel python sim -a {1} -p {2} ::: 1 2 3 4 5 ::: 17.76 20.01 21.510 23.76
たとえば、最大5つのタスクを同時に開始するには、次のように言うことができます。
parallel -j5 python <etc.>
--memfree
または、使用可能なメモリが十分な場合(たとえば、少なくとも256 MB)、新しいタスクを開始するオプションを使用できます。
parallel --memfree 256M python <etc.>
この最後のオプションは、メモリが指定された「予約」値の50%未満に低下すると、最後に開始されたジョブを終了します(ただし、追いつくために自動的にキューに戻されます)。
答え2
コメントで述べたように、これがGNUparallel
の目的です。
for simSeed in 1 2 3 4 5
do
## Launch 5 instances in parallel
parallel -j5 python sim -a $simSeed -p {} ::: 17.76 20.01 21.510 23.76
done
答え3
そのプロセスIDを保存してwait
完了することができます。
for simSeed in {1..5}; do
pids=()
for launchPower in 17.76 20.01 21.510 23.76; do
python sim -a $simSeed -p $launchPower &
pids+=($!)
done
wait ${pids[@]}
done
pids
内部ループバックグラウンドジョブのプロセスIDの配列。${pids[@]}
配列のすべての要素はwaitコマンドとして渡されます。