function _abc {
:
1 min task
:
_check &
}
function _check {
wait for the previous calls of _check to complete
:
15 mins task
:
}
함수 abc는 작업 수에 따라 반복됩니다. 함수 abc는 함수 검사가 완료될 때까지 기다리지 않고 계속 작동해야 하기 때문에 _check는 백그라운드에서 실행되어야 합니다.
따라서 기본적으로 나에게 필요한 것은 기능 검사를 모두 한꺼번에 실행하는 것이 아니라 한 번에 하나씩 실행하는 것입니다. 즉, 기능 검사에 대한 나머지 호출은 대기열에 추가되어야 하며 이전 호출이 완료된 후 한 번에 하나씩 실행되어야 합니다.
답변1
Go의 채널 컨셉여기에서 사용할 수 있습니다:
mkfifo my_pipe
exec 3<>my_pipe
trap 'rm my_pipe' EXIT
printf a >&3
function _abc {
...
_check &
}
function _check {
until read -N1 -u3; do :; done
...
printf a >&3
}
기본적으로:
_abc
및 인스턴스 간 통신을 위해 명명된 파이프를 만듭니다_check
._check
파이프에서 읽기를 차단합니다 (예제에서는 1바이트).- 첫 번째 문자부터 시작하여
_check
파이프에 문자 하나를 인쇄합니다. 함수가 반복되면 아마도 함수 외부에서 수행되어야 할 것입니다. - 각
_check
인스턴스가 종료 시 파이프에 다시 쓰도록 합니다.
쓰기 파이프를 차단하는 것을 방지하기 위해 파이프를 셸에 대한 열린 파일 설명자로 추가했습니다(참조:https://unix.stackexchange.com/a/164295/70524). 또한 여러 read
s가 동일한 파이프에 대기 중이고 그 중 하나가 파이프를 성공적으로 비우면 다른 s는 EOF를 보고합니다. 이 문제를 극복하려면 read
성공적으로 읽을 때까지 반복해야 합니다 .