> 백엔드 개발 > Golang > Go의 'select' 문에서 컨텍스트 취소 우선순위를 어떻게 지정할 수 있나요?

Go의 'select' 문에서 컨텍스트 취소 우선순위를 어떻게 지정할 수 있나요?

Patricia Arquette
풀어 주다: 2024-12-10 09:59:16
원래의
118명이 탐색했습니다.

How Can I Prioritize Context Cancellation in Go's `select` Statements?

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

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