
В моем скрипте 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
и ждал завершения задачи, от которой он зависит?