
In meinem Bash-Skript muss ich zwei verschiedene Funktionen ausführen, taskA
und taskB
, die eine Ganzzahl ( $i
) als Argument annehmen. Da taskB $i
von der Ausführung von abhängt taskA $i
, erledigt der folgende verkürzte Codeabschnitt diese Aufgabe:
#!/bin/bash
taskA(){
...
}
taskB(){
...
}
for i in {1..100};
do
taskA $i
taskB $i
done
Da taskA
es unabhängig voneinander ausgeführt werden kann $i
, kann ich ein Semaphor erstellen (von hier übernommenParallelisieren einer Bash FOR-Schleife) und führe es parallel aus. Allerdings taskB $i
erfordert es die Fertigstellung von taskA $i
und des vorherigen taskB $(i-1)
. Daher führe ich sie einfach nacheinander aus:
#!/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
Ist es zur weiteren Optimierung des Verfahrens möglich, den Semaphor zur parallelen Ausführung von taskA
und gleichzeitigem Ablauf taskB
so zu halten, dass er nicht „überholt“ taskA
, sondern auf die Fertigstellung der für ihn wichtigen TaskA wartet?