가능한 한 빨리 많은 컬 명령을 실행하십시오.

가능한 한 빨리 많은 컬 명령을 실행하십시오.

저는 집에 있는 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 --pipe100코어 시스템에서 초당 약 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... &. 쉘 명령 끝에 & 기호를 추가하는 것은 ;프로세스를 백그라운드로 분기한다는 점을 제외하면 세미콜론을 사용하는 것과 같습니다.

관련 정보