저는 집에 있는 Raspberry Pi에서 일부 로컬 데이터를 수집하고 있으며 가능한 한 빨리 웹 서버에 있는 REST API(제가 가지고 있는)로 데이터를 보내고 싶습니다.
로컬로 수집된 데이터는 초당 최대 100개의 레코드로 전송할 수 있습니다.
루프에서 컬 명령을 실행하면 데이터가 전송됩니다. 200 응답을 기다린 후 다음 레코드를 처리합니다. 내부 데이터 흐름보다 훨씬 느립니다.
Stackoverflow에서 몇 가지 팁을 찾아 조정해 보았지만 컬 명령을 병렬로 보내지 않습니다.
내 코드가 가장 예쁘지 않다는 것을 알고 있으며(특히 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코어 시스템에서 초당 약 25,000개의 작업을 병렬로 실행해야 합니다.
#!/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
... &
. 쉘 명령 끝에 & 기호를 추가하는 것은 ;
프로세스를 백그라운드로 분기한다는 점을 제외하면 세미콜론을 사용하는 것과 같습니다.