Unix에서 게시 요청을 하는 함수에 대해 여러 병렬 호출을 수행하는 방법은 무엇입니까?

Unix에서 게시 요청을 하는 함수에 대해 여러 병렬 호출을 수행하는 방법은 무엇입니까?

매개변수 fileName을 취한 다음 해당 파일을 사용하여 채용 서버에 대한 컬 포스트 호출을 만드는 함수 A가 있습니다. 함수 의사 코드는 다음과 같습니다:

function A(filename)
{
// read file from local 
// send it to deployment server and via curl/any rest client
// read response code
// store data of filename and response code 
}

for all files f in folder :
 A(f)

// See all response code and print data, which all files passed and which all failed

이제 병렬로 실행하려면 다음을 사용합니다.

A(f) & inside for loop

유닉스에서는 쉽게 사용할 수 있는 해시맵/사전 유형 지원이 없기 때문에 강조 표시된 부분, 파일 이름 수집 방법, 응답 코드 세부 정보가 걱정됩니다. 또한 A의 데이터를 인쇄하는 경우 파일 이름을 인쇄하는 라인과 응답 코드를 인쇄하는 라인을 유지하면 병렬 특성으로 인해 두 라인이 연속되지 않을 수 있습니다. 한 줄에 두 가지를 모두 인쇄할 수 있지만 나중에 일부 처리를 위해 결과를 캡처하고 싶습니다. 쉬운 방법이 있나요?

답변1

나는 다음을 사용할 것이다 parset:

a() {
  filename="$1"
  echo "***  Here    is  ***"
  sleep 0.$RANDOM
  echo "the response code to"
  sleep 0.$RANDOM
  echo "$filename"
}
export -f a

# Put the results into a bash array. The order will be kept.
# Here we use "File  a" and "File  b" as input. Change those to your needs
parset res a ::: "File  a" "File  b"
echo "${res[0]}"
echo "${res[1]}"

또는:

# If you want the output into an assoc array, convert the results:
# First build an array of the input
input=("File  a" "File  b")
# Then run the jobs in parallel
parset res a ::: "${input[@]}"

# Finally zip the two arrays to a single associative array
declare -A myassoc
for ((i=0; $i<${#input[@]}; i++)); do
  myassoc[${input[i]}]=${res[i]}
done
echo "${myassoc["File  a"]}"

parsetGNU Parallel의 일부입니다.

활성화하려면 parset기능으로 활성화해야 합니다. 이 기능은 의 일부로 정의됩니다 env_parallel.

다음을 수행하고 쉘을 다시 시작하십시오.

bash:  Put this in $HOME/.bashrc:  . `which env_parallel.bash`
       E.g. by doing:  echo '. `which env_parallel.bash`' >> $HOME/.bashrc
       Supports: aliases, functions, variables, arrays

zsh:   Put this in $HOME/.zshrc:  . `which env_parallel.zsh`
       E.g. by doing:  echo '. `which env_parallel.zsh`' >> $HOME/.zshenv
       Supports: functions, variables, arrays

fish:  Unsupported

ksh:   Put this in $HOME/.kshrc:  source `which env_parallel.ksh`
       E.g. by doing:  echo 'source `which env_parallel.ksh`' >> $HOME/.kshrc
       Supports: aliases, functions, variables, arrays

mksh:  Put this in $HOME/.mkshrc:  source `which env_parallel.mksh`
       E.g. by doing:  echo 'source `which env_parallel.mksh`' >> $HOME/.mkshrc
       Supports: aliases, functions, variables, arrays

pdksh: Put this in $HOME/.profile:  source `which env_parallel.pdksh`
       E.g. by doing:  echo '. `which env_parallel.pdksh`' >> $HOME/.profile
       Supports: aliases, functions, variables, arrays

ash:   Put this in $HOME/.profile:  . `which env_parallel.ash`
       E.g. by doing:  echo '. `which env_parallel.ash`' >> $HOME/.profile
       Supports: aliases, variables

dash:  Put this in $HOME/.profile:  . `which env_parallel.dash`
       E.g. by doing:  echo '. `which env_parallel.dash`' >> $HOME/.profile
       Supports: aliases, variables

csh:   Unsupported

tcsh:  Unsupported

To install in all shells run:

  parset --install

관련 정보