我有以下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
有任何指南吗?
xargs
命令的-P
选项来并行运行任何命令:seq 1 200 | xargs -n1 -P10 curl "http://localhost:5000/example"
这将以最多10个任务并行的方式运行curl
命令200次。
netstat -an | wc -l
查看打开的连接)。导致这种情况的原因是什么?有没有办法让它在结束时退出? - thinkttseq 1 200 | xargs -Iname -P10 curl "http://localhost:5000/example"
使用_I_参数来指定参数的占位符,然后在命令调用中省略参数。 - dark knightxargs -P
选项,您可以并行运行任何命令:xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \
< <(printf '%s\n' {1..400})
curl
命令在一次最多并行8
个作业的情况下运行400
次。-P
会并行运行指定数量的进程。printf '%s\n' {1..400}
将打印从1到400的数字,而 curl
则会最多并行运行8个任务,总共运行400次。 - anubhavabash: 0: ambiguous redirect
- Maxprintf '%s\n' {1..400} | xargs -I % -P 8 curl -I -X POST 'http://localhost:5000/example'
。 - anubhavacurl --parallel
应该比xargs -P n
更快。但是我发现,对于每个请求,xargs
在使用connection: close
时速度更快!请问为什么?curl
是否看到并重用了并行作业的相同连接? - Mamdouh Saeed2020年更新:
Curl现在可以并行获取多个网站:
curl --parallel --parallel-immediate --parallel-max 3 --config websites.txt
网站.txt文件:
url = "website1.com"
url = "website2.com"
url = "website3.com"
curl -i --parallel --parallel-immediate --parallel-max 3 -X POST -H 'Content-Type: application/json' -d '{"x":100}' --config websites.txt
- László Kenéz--next
,但是我觉得重复相同的长URL、不同的-d
值和-H
值让我感到很愚蠢,这导致了错误参数列表太长
。 - Mamdouh Saeed-L
和--remote-name-all
选项。 - Tom Nguyen这是对@saeed
回答的补充。
我遇到了一个问题,它向以下主机发送了不必要的请求。
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"
注意:如果你在命令中使用了 $
符号,请尝试将其替换为其他未使用的字符。
补充@saeed的答案,我创建了一个通用函数,利用函数参数在并行执行中的M
个任务中总共触发N
次命令。
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
个命令。bash_profile.rc
中可以使其更容易。 Gist
seq
读取的索引传递给命令。例如,conc 2 2 echo test
将打印test 1\ntest 2
。为了避免这种情况,使用-I'$XARGI'
而不是-n1
可以解决问题(如果需要索引,则可以在命令中使用$XARGI,否则可以省略)。 - Dario Seidlfor ((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
time curl -X POST --header "http://localhost:5000/example" > output.${x}.${request}.out 2>1 &
我想分享一下如何利用平行的xargs和curl。这与IT技术有关。
使用xargs的好处是可以指定使用多少线程来并行处理curl,而不是使用“&”符号来同时调度所有的curl,例如10000个。
希望对大家有所帮助。
#!/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文件每行有一个值,这些值将被插入到JSON有效载荷中。
# conc N M cmd - fire (N) commands at a max parallelism of (M) each
function conc(){
cmd=("${@:3}")
seq 1 "$1" | xargs -I'$XARGI' -P"$2" "${cmd[@]}"
}
例如:
conc 10 3 curl -L -X POST https://httpbin.org/post -H 'Authorization: Basic dXNlcjpwYXNz' -H 'Content-Type: application/json' -d '{"url":"http://google.com/","foo":"bar"}'
conc 10 3 http --ignore-stdin -F -a user:pass httpbin.org/post url=http://google.com/ foo=bar
curl -X POST ... &
? - Ruslan Osmanovcurl
,也许hey会引起您的兴趣。 - philonous