>백엔드 개발 >Golang >Go에서 취소되지 않는 컨텍스트를 만드는 방법은 무엇입니까?

Go에서 취소되지 않는 컨텍스트를 만드는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-09 06:00:03777검색

How to Create a Context in Go that Doesn't Cancel?

컨텍스트 취소 전파 우회

Go의 컨텍스트 관리는 애플리케이션의 여러 부분 간에 데이터를 전달하고 취소를 처리하는 수단을 제공합니다. 그러나 원본 데이터를 상속하지만 취소의 영향을 받지 않는 컨텍스트가 필요할 때 문제가 발생합니다.

이러한 요구를 해결하기 위해 Go 1.21은 컨텍스트 패키지 내에 WithoutCancel 메서드를 도입하여 이 요구 사항을 충족합니다.

또는 이전 버전의 Go를 사용하는 경우 취소를 방지하도록 특별히 설계된 고유한 컨텍스트 구현을 만들 수 있습니다. 방법은 다음과 같습니다.

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

이 사용자 정의 컨텍스트 구현을 사용하면 다음과 같은 원본 컨텍스트의 복사본을 얻을 수 있습니다.

  • 원래 컨텍스트에 저장된 모든 값을 상속합니다.
  • 원래 컨텍스트가 취소된 후에도 활성 상태를 유지합니다.

이 접근 방식을 사용하면 별도의 고루틴에서 비동기 작업을 실행할 수 있으므로 상위 컨텍스트가 종료되더라도 해당 작업이 실행되도록 보장할 수 있습니다.

위 내용은 Go에서 취소되지 않는 컨텍스트를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.