我试图使用40000个不同的JSON文件向API发送40000个请求。
通常我可以做这样的事情:
for file in /dir/*.json
do
#ab -p $file -T application/json -c1 -n1 <url>
curl -X POST -d@"$file" <url> -H "Content-Type: application/json"
done;我的问题是,我想同时运行请求,例如100,我想要的总时间来发送所有请求等记录。我不能使用-c 100 -n 40000在ab,因为它的相同的网址与不同的文件。
这些文件/请求看起来都类似于
{"source":"000000000000","type":"A"}
{"source":"000000000001","type":"A"}
{"source":"000000000003","type":"A"}我找不到任何支持这一点的工具(例如ab)。
我在这里看到了这示例(对这个问题进行了建模)。我不知道为什么当mkfifo是一个文件而不是dir时,这个例子会是"cat /tmp“。可能有用吗?
mkfifo tmp
counter=0
for file in /dir/*.json
do
if [ $counter -lt 100 ]; then
curl -X POST -H "Content-Type: application/json" -d@"$file" <url> &
let $[counter++];
else
read x < tmp
curl -X POST -H "Content-Type: application/json" -d@"$file" <url> &
fi
done;
cat /tmp > /dev/null
rm tmp我应该如何在perl、ksh、bash或类似的语言中实现这一目标?或者,是否有人知道任何支持这种方法的工具?
谢谢!
发布于 2018-07-12 09:14:35
如果您的请求只是按每次以不同JSON发送这40000个curl请求所需的总时间来计算,那么您可以很好地使用GNU并行。该工具有很好的方法,通过使用您的机器上的多个核来实现作业并发。
下载过程非常简单。按照如何将GNU并行(noarc.rpm)安装在CentOS 7上快速和简单的步骤列表。该工具有更复杂的标志来解决多个用例。不过,为了满足您的需求,只需转到包含这些JSON文件的文件夹并执行以下操作
parallel --dry-run -j10 curl -X POST -H "Content-Type: application/json" -d@{} <url> ::: *.json根据parallel如何设置标志和处理参数并开始运行命令,上面的命令试图使您的命令干涸。这里,{}表示您的JSON文件。我们在这里指定一次运行10个作业,并根据其在您的机器上运行的速度以及检查机器上的核数来增加数量。还有一些标志可以限制parallel允许使用的整个CPU,这样它就不会完全阻塞您的系统。
删除--dry-run以运行实际命令。要计时完成过程所需的时间,请使用time命令在实际命令之前加上time parallel ...前缀
https://stackoverflow.com/questions/51246521
复制相似问题