내 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
작업이 완료될 때까지 기다리도록 할 수 있습니까?