尽可能快地执行许多curl命令

尽可能快地执行许多curl命令

我正在家里的 Raspberry Pi 上收集一些本地数据,并且希望尽快将数据发送到网络服务器上的 REST API(我拥有)。

本地收集的数据传输速度可达每秒 100 条记录。

如果我在循环中执行curl命令,它将发送数据...等待200响应,然后处理下一条记录...比我的内部数据流慢得多。

我在 Stackoverflow 上找到了一些提示并尝试调整它们,但它不会并行发送curl命令。

我知道我的代码不是最漂亮的(特别是关于 mycurl 函数的使用),我准备好接受建议

#!/bin/bash

host="localhost"
port="********"

mycurl() {
    data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
   curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
}
export -f mycurl

#----------------------LOOP starts------------------------
while true; 
do 

   nc -d $host $port | while IFS="," read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 f22
   do 
      if [ "$f15" != "" ]; then 
          seq 1000  | parallel --no-notice --joblog log -j0 mycurl ::: ${f5} ::: ${f7} ::: ${f8} ::: ${f15} ::: ${f16} ::: ${17} ::: ${18} ::: ${19} ::: ${20} ::: ${21};
      fi
   done

done

答案1

GNU Parallel 每个作业的开销为 2-5 毫秒,接近每秒 100 个条目。为了减轻这种情况,你可以用parallel --pipe.这应该在 100 核机器上每秒并行运行大约 25000 个作业:

#!/bin/bash

host="localhost"
port="********"

mycurl() {
  if [ "${15}" != "" ]; then
    # The numbering here should probably be adjusted
    data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
    curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
  fi
}
export -f mycurl

#----------------------LOOP starts------------------------
while true; 
do 
  nc -d $host $port
done |
  parallel -j100 --pipe --block 100k parallel --colsep , -j0 mycurl

答案2

为什么不将每个curl调用分叉到后台:curl... &。在 shell 命令末尾添加 & 符号就像使用分号一样;,只不过它将进程分叉到后台。

相关内容