> 백엔드 개발 > Golang > 결정적 실행을 위해 Go의 'select' 문에서 사례의 우선 순위를 지정하는 방법은 무엇입니까?

결정적 실행을 위해 Go의 'select' 문에서 사례의 우선 순위를 지정하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-06 09:53:11
원래의
661명이 탐색했습니다.

How to Prioritize Cases in Go's `select` Statements for Deterministic Execution?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿