>  기사  >  백엔드 개발  >  취소 전파 없이 Go에서 컨텍스트를 어떻게 사용할 수 있나요?

취소 전파 없이 Go에서 컨텍스트를 어떻게 사용할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-08 20:57:02983검색

How Can I Use Contexts in Go Without Cancellation Propagation?

취소 전파가 없는 컨텍스트: 심층 분석

Go의 컨텍스트는 요청과 함께 임의의 값을 전달하고 취소를 추적하는 메커니즘을 제공합니다. 기본적으로 모든 컨텍스트는 동일한 취소 메커니즘을 공유합니다. 그러나 특정 시나리오에서는 취소에서 컨텍스트 전파를 분리해야 할 수도 있습니다.

비취소 컨텍스트의 필요성

요청 수명 이후의 작업을 수행하는 HTTP 핸들러를 고려하세요. 응답을 반환한 후 핸들러는 고루틴에서 비동기 작업을 시작할 수 있습니다. 이 작업은 컨텍스트 값에 대한 액세스가 필요할 수 있지만 원래 요청 컨텍스트가 취소된 경우 종료되어서는 안 됩니다.

Creating Custom Non-Canceling Contexts

WithoutCancel은 Go 1.21에 도입되어 간단한 방법을 제공합니다. 취소되지 않는 컨텍스트를 생성합니다. 이 방법을 사용하면 저장된 모든 값을 포함하지만 취소 상태와는 독립적인 원본 컨텍스트의 복사본을 얻을 수 있습니다.

비취소 컨텍스트 구현

Go 1.21 이전에는 사용자 정의 취소되지 않는 컨텍스트의 구현이 필요했습니다. 핵심은 context.Context 인터페이스를 충족하는 유형을 생성하고 취소를 방지하기 위해 다음 메서드를 재정의하는 것입니다.

  • Deadline(): 항상 0을 반환하고 두 번째 반환 값을 false로 설정합니다. 기한이 없음을 나타냅니다.
  • Done(): 취소가 불가능함을 나타내는 nil 채널을 반환합니다.
  • Err(): 항상 오류가 발생하지 않았음을 나타내는 nil을 반환합니다.

또한 구현 시 원본 컨텍스트를 저장하고 Value() 호출을 위임하여 저장된 값을 검색해야 합니다.

사용 예 취소되지 않는 컨텍스트

import (
    "context"

    "github.com/mypackage/mycontext"
)

func Handler(ctx context.Context) (interface{}, error) {
    result := doStuff(ctx)
    newContext := mycontext.WithoutCancel(ctx)
    go func() {
        doSomethingElse(newContext)
    }()
    return result
}

결론

취소되지 않는 원리를 이해함으로써 개발자는 컨텍스트를 파악하고 사용 가능한 도구를 활용하여 맞춤형 솔루션을 만들거나 Go의 내장 기능을 활용하여 취소 없이 원하는 컨텍스트 전파를 달성할 수 있습니다.

위 내용은 취소 전파 없이 Go에서 컨텍스트를 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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