我有下面的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
有向导吗?
syqv5f0l1#
您可以使用带有-P选项的xargs来并行运行任何命令:
-P
xargs
seq 1 200 | xargs -n1 -P10 curl "http://localhost:5000/example"
这将运行curl命令200次,最多并行运行10个作业。
curl
ufj5ltwl2#
使用xargs -P选项,您可以并行运行任何命令:
xargs -P
xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \ < <(printf '%s\n' {1..400})
这将运行给予curl命令400次,最多并行运行8个作业。
j7dteeu83#
2020年更新:
Curl现在可以并行获取多个网站:
curl --parallel --parallel-immediate --parallel-max 3 --config websites.txt
websites.txt文件:
url = "website1.com" url = "website2.com" url = "website3.com"
v64noz0r4#
这是对@saeed's答案的补充。我遇到了一个问题,它向以下主机发出了不必要的请求
@saeed's
0.0.0.1, 0.0.0.2 .... 0.0.0.N
原因是命令xargs正在向curl命令传递参数。为了防止传递参数,我们可以使用-I标志指定替换参数的字符。所以我们将它作为,
-I
... xargs -I '$' command ...
现在,xargs将替换任何$文本所在的参数。如果没有找到,则不传递参数。因此,使用此命令的最后一个命令将是。
$
seq 1 200 | xargs -I $ -n1 -P10 curl "http://localhost:5000/example"
注意:如果您在命令中使用$,请尝试将其替换为其他未使用的字符。
5cg8jx4n5#
除了@saeed's答案之外,我还创建了一个泛型函数,它利用函数参数在并行的M作业中总共触发N次命令
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/'
这将以最大并行度2触发10 curl命令。将此函数添加到bash_profile.rc中会使操作变得更加简单。Gist
10
bash_profile.rc
7xllpg7q6#
在结尾处加上“等待”,并将其置于背景中。
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 &
mzsu5hc07#
我想分享一下我如何在curl中使用并行xargs的例子。使用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有效负载中
liwlm1x98#
根据@isopropylcyanide提供的解决方案和@Dario Seidl的评论,我发现这是最好的响应,因为它可以处理curl和httpie。
# 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
8条答案
按热度按时间syqv5f0l1#
您可以使用带有
-P
选项的xargs
来并行运行任何命令:这将运行
curl
命令200次,最多并行运行10个作业。ufj5ltwl2#
使用
xargs -P
选项,您可以并行运行任何命令:这将运行给予
curl
命令400次,最多并行运行8个作业。j7dteeu83#
2020年更新:
Curl现在可以并行获取多个网站:
websites.txt文件:
v64noz0r4#
这是对
@saeed's
答案的补充。我遇到了一个问题,它向以下主机发出了不必要的请求
原因是命令
xargs
正在向curl命令传递参数。为了防止传递参数,我们可以使用-I
标志指定替换参数的字符。所以我们将它作为,
现在,
xargs
将替换任何$
文本所在的参数。如果没有找到,则不传递参数。因此,使用此命令的最后一个命令将是。注意:如果您在命令中使用
$
,请尝试将其替换为其他未使用的字符。5cg8jx4n5#
除了
@saeed's
答案之外,我还创建了一个泛型函数,它利用函数参数在并行的M
作业中总共触发N
次命令这将以最大并行度2触发
10
curl命令。将此函数添加到
bash_profile.rc
中会使操作变得更加简单。Gist7xllpg7q6#
在结尾处加上“等待”,并将其置于背景中。
它们都将输出到相同的stdout,但您可以将时间的结果(以及stdout和stderr)重定向到一个命名文件:
mzsu5hc07#
我想分享一下我如何在curl中使用并行xargs的例子。
使用xargs的优点是你可以指定有多少线程将被用于并行化curl,而不是使用带有“&”的curl,这将同时调度所有的线程,比如说10000个curl。
希望对smdy有所帮助:
.csv文件每行有1个值,将插入到json有效负载中
liwlm1x98#
根据@isopropylcyanide提供的解决方案和@Dario Seidl的评论,我发现这是最好的响应,因为它可以处理curl和httpie。
例如: