私の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
プロセスをさらに最適化するために、セマフォを並列に実行しながら同時にtaskA
実行してtaskB
、「追い越す」ことなくtaskA
タスクが完了するのを待つようにできますか?