
Ich sammle einige Daten lokal zu Hause auf einem Raspberry Pi und möchte die Daten so schnell wie möglich an eine REST-API (die mir gehört) auf einem Server im Web senden.
Die lokal erfassten Daten könnten mit einer Geschwindigkeit von bis zu 100 Datensätzen pro Sekunde fließen.
Wenn ich einen Curl-Befehl in einer Schleife ausführe, werden die Daten gesendet ... Warten Sie auf die 200-Antwort und verarbeiten Sie dann den nächsten Datensatz ... Viel langsamer als mein interner Datenfluss.
Ich habe hier auf Stackoverflow einige Hinweise gefunden und versucht, sie anzupassen, aber die Curl-Befehle wurden nicht parallel gesendet.
Ich weiß, dass mein Code nicht der schönste ist (insbesondere was die Verwendung der mycurl-Funktion betrifft) und bin offen für Vorschläge
#!/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
Antwort1
GNU Parallel hat einen Overhead von 2-5 ms pro Job, was fast 100 Einträge pro Sekunde entspricht. Um das zu mildern, können Sie es mit umschließen parallel --pipe
. Dies sollte auf einer 100-Core-Maschine etwa 25.000 Jobs parallel pro Sekunde ausführen:
#!/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
Antwort2
Warum nicht jeden curl
Aufruf in den Hintergrund verzweigen: curl
.... &
Ein Et-Zeichen am Ende eines Shell-Befehls zu setzen ist wie die Verwendung eines ;
Semikolons, nur dass es den Prozess in den Hintergrund verzweigt.