簡単な例では、シェルスクリプトでの並列処理を理解し、出力に決定的に(ランダムな順序ではなく)順番に値を追加したいと思います。コードスニペットは次のとおりです。
x=""
appendnum() {
num=$1; x=`echo $x$num`
}
for no in {0..10}
do
appendnum $no &
done
wait $(jobs -rp)
echo $x
期待される出力は012345678910でしたが、結果はnullでした。完了するまでPIDを繰り返しようとしましたが、成功しませんでした。メインスレッドは、各並列プロセスが完了するのを待つことを望みます。追加の数値は一例です。
私の問題の説明は次のとおりです。 3つのタスクがあることを考えると、次のような応答リストが欲しいです[responseof(task1),responseof(task2),responseof(task3)]
。ジョブ数は最大50個まで可能です。ジョブ数に関係なく、応答時間は同じでなければなりません。最も効率的で正しい方法は何ですか?
ベストアンサー1
私が正しく理解した場合は、次のようにします。
- ジョブを並列に実行します。理想的には、単一のジョブを実行する時間内にこれらのすべてのジョブが完了するようにする必要があります。 (とても現実的ではありませんが、頑張って頑張ってみます)
- 一部の後続のジョブが前のジョブの前に完了しても、出力順序を維持します。
これを念頭に置いて、次のことを試すことができます。
parallel -k -j10 'sleep {}; echo -n {}' ::: {10..1}
実行される最初の操作は最も時間がかかりますが、オプションを追加したため、-k
ユーティリティparallel
は順序を維持して最終的に出力します。
10987654321
この-k
オプションがない場合、出力は反転され、コマンドが完了すると表示されます。
12345678910
詳細が必要な場合は、チュートリアルを確認してください。https://www.gnu.org/software/parallel/parallel_tutorial.html