병렬 루프에 의존하는 다른 작업을 순차적으로 실행하는 동안 bash의 병렬 for 루프

병렬 루프에 의존하는 다른 작업을 순차적으로 실행하는 동안 bash의 병렬 for 루프

내 Bash 스크립트에서는 두 가지 다른 함수를 실행해야 하며 taskA정수 taskB( )를 매개변수로 사용합니다 $i. taskB $i완료 여부에 따라 다르 므로 taskA $i다음과 같은 짧은 코드가 작업을 수행합니다.

#!/bin/bash

taskA(){
  ...
}

taskB(){
  ...
}

for i in {1..100};
do
  taskA $i
  taskB $i
done

taskA다른 위치에서 독립적으로 실행될 수 있으므로 세마포어 $i를 만들 수 있습니다(여기에서 가져옴).Bash FOR 루프 병렬화) 병렬로 실행합니다. 그러나 taskB $i완료 taskA $i및 이전 항목이 필요하므로 taskB $(i-1)나중에 순차적으로 실행합니다.

#!/bin/bash

open_sem(){
  mkfifo pipe-$$
  exec 3<>pipe-$$
  rm pipe-$$
  local i=$1
  for((;i>0;i--)); do
    printf %s 000 >&3
  done
}

run_with_lock(){
  local x
  read -u 3 -n 3 x && ((0==x)) || exit $x
  (
   ( "$@"; )
  printf '%.3d' $? >&3
  )&
}

taskA(){
  ...
}

taskB(){
  ...
}

N=36
open_sem $N
for i in {1..100};
do
  run_with_lock taskA $i
done

wait

for i in {1..100};
do
  taskB $i
done

프로세스를 더욱 최적화하기 위해 세마포어를 병렬로 실행하면서 동시에 taskA실행하여 taskB"추월"하지 않고 taskA작업이 완료될 때까지 기다리도록 할 수 있습니까?

관련 정보