병렬 루프에 종속된 다른 작업을 동시에 순차적으로 실행하는 bash의 병렬 for 루프

병렬 루프에 종속된 다른 작업을 동시에 순차적으로 실행하는 bash의 병렬 for 루프

내 Bash 스크립트에서는 정수( )를 인수로 사용하는 두 가지 다른 함수 taskA및 를 실행해야 합니다 . 의 완성 여부에 따라 달라 지므로 다음과 같은 축약된 코드가 작업을 수행합니다.taskB$itaskB $itaskA $i

#!/bin/bash

taskA(){
  ...
}

taskB(){
  ...
}

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

taskA서로 다른 위치에서 독립적으로 실행될 수 있으므로 세마포어 $i를 만들 수 있습니다(여기에서 가져옴).Bash FOR 루프 병렬화) 병렬로 실행합니다. 그러나 이전 taskB $i의 완료가 필요합니다 . 따라서 나중에 순차적으로 실행합니다.taskA $itaskB $(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의존하는 작업이 완료될 때까지 기다리는 것이 가능합니까?

관련 정보