並列ループに依存する別のタスクを同時に順次実行する bash の並列 for ループ

並列ループに依存する別のタスクを同時に順次実行する bash の並列 for ループ

私の bash スクリプトでは、引数として整数 ( ) を取る2 つの異なる関数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

手順をさらに最適化するために、セマフォを並列実行用に保持し、依存するタスク A が「追い越す」ことなくその完了を待つような方法で同時にtaskA実行することは可能ですか?taskBtaskA

関連情報