
No meu script bash, preciso executar duas funções diferentes, taskA
e taskB
, que usam um número inteiro ( $i
) como argumento. Como taskB $i
depende da conclusão de taskA $i
, o seguinte trecho de código abreviado faz o trabalho:
#!/bin/bash
taskA(){
...
}
taskB(){
...
}
for i in {1..100};
do
taskA $i
taskB $i
done
Como taskA
pode ser executado de forma $i
independente, posso criar um semáforo (retirado daquiParalelizar um loop Bash FOR) e execute-o em paralelo. No entanto, taskB $i
requer a conclusão de taskA $i
e do anterior taskB $(i-1)
. Portanto, eu apenas os executo sequencialmente depois:
#!/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
Para otimizar ainda mais o procedimento, é possível manter o semáforo para execução paralela taskA
e rodar taskB
simultaneamente de forma que ele não “ultrapasse” taskA
e aguarde a conclusão da tarefaA da qual depende?