
私の bash スクリプトでは、引数として整数 ( ) を取る2 つの異なる関数taskA
とを実行する必要があります。は の完了に依存するため、次の省略されたコードで目的を達成できます。taskB
$i
taskB $i
taskA $i
#!/bin/bash
taskA(){
...
}
taskB(){
...
}
for i in {1..100};
do
taskA $i
taskB $i
done
taskA
独立して実行できるので$i
、セマフォを作成できます(ここから取得)Bash FORループを並列化する) を並列に実行します。ただし、 にはと前の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
手順をさらに最適化するために、セマフォを並列実行用に保持し、依存するタスク A が「追い越す」ことなくその完了を待つような方法で同時にtaskA
実行することは可能ですか?taskB
taskA