このループを並列にする方法:
for a in $(seq 1 3)
do
for b in 0.1 0.2
do
echo process with a=$a and b=$b &
done
done
並列かどうか?実際、echo process with a=$a and b=$b
各値の組み合わせに対してコマンドを並列に実行したいのですが、上記のシェルをa
実行b
した結果は次のとおりです。
process with a=1 and b=0.1
process with a=2 and b=0.2
process with a=2 and b=0.1
process with a=3 and b=0.2
process with a=3 and b=0.1
process with a=1 and b=0.2
ありがとうございます。
答え1
GNU Parallelを使用すると、次のようになります。
parallel echo process with a={1} and b={2} ::: 1 2 3 ::: 0.1 0.2
seq 1 3 | parallel echo process with a={1} and b={2} :::: - ::: 0.1
parallel echo process with a={1} and b={2} :::: <(seq 1 3) ::: 0.1 0.2
並列化は価値がほとんどないecho
ので、これは単なる例であると思います。echo
答え2
内部ループで時間がかかるものを実行する場合(echo
例:まもなく実行)、ループが開始されると、すべての非同期プロセスが実行されます。同時に。
ループ自体は「パラレル」ではありません。
答え3
レビューをしなければならないのに少なすぎます。
ソリューションがすべてのサイズの出力に対して機能し、あるジョブの出力が別のジョブの出力と混在していないことを確認してください。テストする小さな例は次のとおりです。
#!/bin/bash
# stress test of parallelizing programs
longline() {
# print one big line with 'a's followed by 'b's followed by 'c's
perl -e 'print "@ARGV ", map { "$_"x10000000 } (a..c)' "$@"
echo
}
echo "Run testprogram in parallel"
for a in $(seq 1 3)
do
for b in 0.1 0.2
do
longline $a $b &
done
done |
# use 'tr' to compress many 'a's into a single 'a'
# if the output is not 'abc' on every line, lines have been mixed
tr -cs '@'
echo "Run testprogram in serial"
for a in $(seq 1 3)
do
for b in 0.1 0.2
do
longline $a $b
done
done | tr -cs '@'
echo "Compare with GNU Parallel"
export -f longline
parallel -kj0 longline :::: <(seq 1 3) ::: 0.1 0.2 | tr -cs '@'