
En mi script bash, necesito ejecutar dos funciones diferentes, taskA
y taskB
, que toman un número entero ( $i
) como argumento. Dado que taskB $i
depende de la finalización de taskA $i
, el siguiente fragmento de código abreviado hace el trabajo:
#!/bin/bash
taskA(){
...
}
taskB(){
...
}
for i in {1..100};
do
taskA $i
taskB $i
done
Como taskA
se puede ejecutar en diferentes$i
independiente, puedo crear un semáforo (tomado de aquíParalelizar un bucle FOR de Bash) y ejecutarlo en paralelo. Sin embargo, taskB $i
requiere la finalización de taskA $i
y el anterior taskB $(i-1)
. Por lo tanto, simplemente los ejecuto secuencialmente después:
#!/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 optimizar aún más el procedimiento, ¿es posible mantener el semáforo para la ejecución paralela taskA
y ejecutarlo taskB
simultáneamente de tal manera que no "supere" taskA
y espere a que se complete la tarea A de la que depende?