비재진입 함수는 호출 횟수와 고루틴 수에 관계없이 어느 시점에서 한 번만 실행될 수 있는 함수입니다.
특정 서비스는 특정 조건을 폴링하고 1초마다 일부 상태를 모니터링합니다. 우리는 각 상태를 차단하지 않고 독립적으로 확인하기를 원합니다. 구현은 다음과 같습니다. otherStatus()는 CheckSomeStatus()가 완료될 때까지 기다리지 않습니다.
각 확인에는 일반적으로 1초도 채 걸리지 않는 짧은 시간이 걸립니다. 하지만 CheckAnotherStatus() 자체를 실행하는 데 1초 이상 걸리면 어떻게 될까요? 검사 실행 시간에 영향을 미치는 예기치 않은 네트워크 또는 디스크 지연이 있을 수 있습니다. 한 기능을 동시에 두 번 실행하는 것이 의미가 있나요? 그렇지 않다면 재진입이 불가능하기를 원합니다.
차단, 비재진입 기능함수가 여러 번 실행되는 것을 방지하는 간단한 방법은 sync.Mutex를 사용하는 것입니다.
위 루프에서 이 함수를 호출하는 것에만 관심이 있다고 가정하면 함수 외부에서 잠금을 구현할 수 있습니다.
func main() { tick := time.Tick(time.Second) go func() { for range tick { go CheckSomeStatus() go CheckAnotherStatus() } }() }
위 코드는 루프를 여러 번 반복하여 CheckAnotherStatus()가 실행되지 않도록 합니다. CheckAnotherStatus()가 이전에 실행되었을 때 루프의 모든 후속 반복은 뮤텍스에 의해 차단되었습니다.
차단 솔루션에는 다음과 같은 속성이 있습니다.루프 반복 횟수만큼 "CheckAnotherStatus()"에 대한 호출을 보장합니다.
"CheckAnotherStatus()" 실행이 중단되었다고 가정하면 후속 반복에서는 동일한 함수를 호출하라는 요청이 발생합니다.
Yield, non-reentrant function
상태 확인 스토리에서 다음 10번의 호출을 위해 쌓아두는 것은 아마도 말이 되지 않을 것입니다. 지연된 CheckAnotherStatus() 실행이 완료되고 10개의 호출이 모두 갑자기 순차적으로 실행되며 다음 초 내에 완료될 수 있으며 동일한 초에 10개의 동일한 검사가 완료됩니다.
또 다른 해결책은 항복하는 것입니다. 수익성 있는 솔루션은 다음과 같습니다."CheckAnotherStatus()"가 이미 실행된 경우 실행을 중단합니다.
"CheckAnotherStatus()"는 최대 한 번만 실행됩니다.
루프 반복 횟수에 비해 실제로 "CheckAnotherStatus()"에 대한 호출이 더 적게 실행될 수 있습니다.
위 내용은 Golang 비재진입 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!