並列ループに依存する他のジョブを順次実行している間に bash の並列 for ループ

並列ループに依存する他のジョブを順次実行している間に bash の並列 for ループ

私のBashスクリプトでは、2つの異なる関数を実行する必要があり、taskA整数taskB()をパラメータとして使用します$itaskB $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タスクが完了するのを待つようにできますか?

関連情報