Параллельный цикл for в bash с одновременным последовательным выполнением другой задачи с зависимостями от параллельного цикла

Параллельный цикл for в bash с одновременным последовательным выполнением другой задачи с зависимостями от параллельного цикла

В моем скрипте 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, я могу создать семафор (взято отсюдаРаспараллелить цикл FOR в Bash) и выполнить его параллельно. Однако, 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и ждал завершения задачи, от которой он зависит?

Связанный контент