Go select 문에서 우선순위 처리
Go에서 select 문을 사용할 때 사례 평가 순서는 일반적으로 결정적이지 않습니다. 그러나 일부 시나리오에서는 특정 사례의 실행 우선순위를 정해야 할 수도 있습니다.
컨텍스트 취소 우선순위
정상적으로 종료하려는 경우 다음 코드를 고려하세요. 컨텍스트가 취소될 때 하트비트 발신자:
func sendRegularHeartbeats(ctx context.Context) { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): sendHeartbeat() } } }
그러나 컨텍스트가 즉시 닫히면 코드는 "완료" 사례가 실행되기 전에 여전히 하트비트를 전송할 수 있습니다.
해결책: 도우미 채널 우선순위
이 문제를 해결하는 한 가지 접근 방식은 도우미를 사용하는 것입니다. 컨텍스트 취소 사례의 우선순위를 지정하는 채널:
func sendRegularHeartbeats(ctx context.Context) { done := make(chan struct{}) go func() { <-ctx.Done() close(done) }() for { select { case <-done: return case <-time.After(1 * time.Second): sendHeartbeat() } } }
이 경우 완료 채널은 컨텍스트가 취소되면 "ctx.Done()" 사례가 먼저 평가됩니다.
추가 고려 사항
이 솔루션은 우선 순위를 향상시키지만 가능성을 완전히 제거하지는 않습니다. "완료" 사례가 실행되기 전에 전송되는 하트비트의 모습입니다. 진정한 동기화된 종료를 위해서는 원자 변수나 뮤텍스와 같은 동기화 프리미티브를 사용하여 컨텍스트 취소 시 하트비트 전송이 즉시 종료되도록 하는 것이 좋습니다.
위 내용은 결정적 실행을 위해 Go의 'select' 문에서 사례의 우선 순위를 지정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!