
我正在家中的 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 命令末尾添加 & 符號就像使用分號一樣;
,只不過它將進程分叉到後台。