我有以下shell脚本。问题是我想并行/并发地运行事务而不等待一个请求完成转到下一个请求。例如,如果我发出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
任何指南?
答案 0 :(得分:12)
使用xargs -P
选项,您可以并行运行任何命令:
xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \
< <(printf '%s\n' {1..400})
这将运行给curl
命令400次并行最多8个作业。
答案 1 :(得分:4)
这是@saeed's
答案的补充。
我遇到了一个问题,它向以下主机发出了不必要的请求
0.0.0.1, 0.0.0.2 .... 0.0.0.N
原因是命令xargs
将参数传递给curl命令。为了防止传递参数,我们可以使用-I
标志指定要替换参数的字符。
所以我们将其用作
... xargs -I '$' command ...
现在,xargs
将替换找到$
文字的位置的参数。如果找不到,则不传递参数。因此,使用此命令将是最终命令。
seq 1 200 | xargs -I $ -n1 -P10 curl "http://localhost:5000/example"
注意:如果您在命令中使用$
,请尝试将其替换为其他未使用的字符。
答案 2 :(得分:2)
除了@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/'
这将以最大两个并行度触发10
curl命令。
将此功能添加到bash_profile.rc
使其更容易。 Gist
答案 3 :(得分:1)
在最后添加“等待”,并将它们作为背景。
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 &
答案 4 :(得分:0)
您可以将xargs
与-P
选项一起使用来并行运行任何命令:
seq 1 200 | xargs -n1 -P10 curl "http://localhost:5000/example"
这将运行curl
命令200次,最多可并行执行10个作业。
答案 5 :(得分:0)
想分享我如何将并行 xargs 与 curl 结合使用的示例。
使用 xargs 的优点是,您可以指定将使用多少个线程来并行化 curl,而不是使用带有“&”的 curl 来同时调度所有比方说 10000 个 curl。
希望对smdy有所帮助:
#!/bin/sh
url=/any-url
currentDate=$(date +%Y-%m-%d)
payload='{"field1":"value1", "field2":{},"timestamp":"'$currentDate'"}'
threadCount=10
cat $1 | \
xargs -P $threadCount -I {} curl -sw 'url= %{url_effective}, http_status_code = %{http_code},time_total = %{time_total} seconds \n' -H "Content-Type: application/json" -H "Accept: application/json" -X POST $url --max-time 60 -d $payload
.csv 文件每行有 1 个值,将插入到 json 负载中