Go Select 문의 우선순위 지정
특정 시나리오에서는 Select 문의 Case 블록 실행 우선순위를 지정하는 것이 중요합니다. 특히, 취소 이벤트를 나타내는 컨텍스트로 작업할 때 적절한 프로그램 종료를 보장하기 위해 완료 신호를 즉시 처리하는 것이 중요합니다.
다음 코드를 고려하세요.
func sendRegularHeartbeats(ctx context.Context) { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): sendHeartbeat() } } }
이 루틴은 실행됩니다. 별도의 고루틴으로 구성되어 정기적으로 하트비트를 전송합니다. 그러나 컨텍스트가 취소되면 코드는 Done 사례가 처리되기 전에 때때로 하트비트를 보낼 수 있습니다.
select 문의 기본 동작은 사례 평가 순서를 보장하지 않으므로 강제 적용이 필요합니다. 원하는 우선순위를 명시적으로 지정합니다. 불완전한 접근 방식 중 하나는 하트비트 전송을 수행하기 전에 닫힌 컨텍스트를 확인하는 것입니다.
func sendRegularHeartbeats(ctx context.Context) { ticker := time.NewTicker(time.Second) defer ticker.Stop() for { // First select select { case <-ctx.Done(): return default: } // Second select select { case <-ctx.Done(): return case <-ticker.C: // Check if context is done again in case a concurrent Done event arrived select { case <-ctx.Done(): default: } sendHeartbeat() } } }
이 방법은 완료 신호의 우선 순위를 지정하지만 추가적인 경쟁 조건을 도입합니다. Done 이벤트와 Ticker 이벤트가 동시에 발생하는 경우 Done 이벤트가 처리되기 전에 하트비트 전송이 발생할 수 있습니다.
안타깝게도 현재 Go에서는 이 문제에 대한 완벽한 해결책이 없습니다. 그러나 제공된 해결 방법은 이러한 경쟁 조건이 발생할 가능성을 최소화하기 위해 중첩된 select 문을 도입하여 원본 코드를 개선합니다.
위 내용은 Go의 'select' 문에서 컨텍스트 취소 우선순위를 어떻게 지정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!