次のシェルスクリプトがあります。問題は、1つの要求が終了して次の要求に進むのを待たずに、トランザクションを並列/並行して実行したいことです。たとえば、20個のリクエストを行った場合、それらを同時に実行してもらいます。
for ((request=1;request<=20;request++))
do
for ((x=1;x<=20;x++))
do
time curl -X POST --header "http://localhost:5000/example"
done
done
ガイドは?
xargs -P
オプションを使用すると、任意のコマンドを並行して実行できます。
xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \
< <(printf '%s\n' {1..400})
これにより、give curl
コマンドが400回実行され、最大8つのジョブが並行して実行されます。
xargs
と-P
オプションを使用して、任意のコマンドを並行して実行できます。
seq 1 200 | xargs -n1 -P10 curl "http://localhost:5000/example"
これにより、curl
コマンドが200回実行され、最大10個のジョブが並行して実行されます。
最後に「待機」を追加し、背景を付けます。
for ((request=1;request<=20;request++))
do
for ((x=1;x<=20;x++))
do
time curl -X POST --header "http://localhost:5000/example" &
done
done
wait
それらはすべて同じstdoutに出力しますが、時間の結果(およびstdoutとstderr)を名前付きファイルにリダイレクトできます。
time curl -X POST --header "http://localhost:5000/example" > output.${x}.${request}.out 2>1 &
@saeed's
の回答に加えて、並列でN
ジョブで合計M
回コマンドを実行する関数引数を使用する汎用関数を作成しました
function conc(){
cmd=("${@:3}")
seq 1 "$1" | xargs -n1 -P"$2" "${cmd[@]}"
}
$ conc N M cmd
$ conc 10 2 curl --location --request GET 'http://google.com/'
これにより、最大2つの並列処理で10
curlコマンドが実行されます。
この関数をbash_profile.rc
に追加すると、より簡単になります。