
在我的 bash 腳本中,我需要執行兩個不同的函數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
,等待其依賴的taskA完成?