bash - 큐 서브쉘

bash - 큐 서브쉘
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
}

기본적으로:

  1. _abc및 인스턴스 간 통신을 위해 명명된 파이프를 만듭니다 _check.
  2. _check파이프에서 읽기를 차단합니다 (예제에서는 1바이트).
  3. 첫 번째 문자부터 시작하여 _check파이프에 문자 하나를 인쇄합니다. 함수가 반복되면 아마도 함수 외부에서 수행되어야 할 것입니다.
  4. _check인스턴스가 종료 시 파이프에 다시 쓰도록 합니다.

쓰기 파이프를 차단하는 것을 방지하기 위해 파이프를 셸에 대한 열린 파일 설명자로 추가했습니다(참조:https://unix.stackexchange.com/a/164295/70524). 또한 여러 reads가 동일한 파이프에 대기 중이고 그 중 하나가 파이프를 성공적으로 비우면 다른 s는 EOF를 보고합니다. 이 문제를 극복하려면 read성공적으로 읽을 때까지 반복해야 합니다 .

관련 정보