수색…


통사론

  • type CancelFunc func ()
  • func 배경 () 컨텍스트
  • func TODO () 컨텍스트
  • func WithCancel (부모 컨텍스트) (ctx 컨텍스트, CancelFunc)
  • func WithDeadline (부모 컨텍스트, 최종 기한 time.Time) (컨텍스트, CancelFunc)
  • func WithTimeout (부모 컨텍스트, 제한 시간 time.Duration) (컨텍스트, CancelFunc)
  • func WithValue (부모 컨텍스트, 키 인터페이스 {}, val 인터페이스 {})

비고

context 패키지 (Go 1.7) 또는 golang.org/x/net/context 패키지 (Pre 1.7)는 요청 범위 값과 마감 시간을 API 경계와 서비스간에 전달하는 데 사용할 수있는 컨텍스트를 만드는 인터페이스입니다 상기 인터페이스의 간단한 구현으로서.

옆으로 : "컨텍스트"라는 단어는 전체 트리 또는 트리의 개별 나뭇잎을 나타내는 데 느슨하게 사용됩니다 (예 : 실제의 context.Context 값.

상위 레벨에서 컨텍스트는 트리입니다. 새 잎은 생성 될 때 트리에 추가되고 (부모 값을 갖는 context.Context ), 나뭇잎은 결코 트리에서 제거되지 않습니다. 모든 컨텍스트는 그 위의 모든 값에 대한 액세스 권한을 가지며 (데이터 액세스는 위쪽으로 만 흐른다) 컨텍스트가 취소되면 자식도 취소됩니다 (취소 신호는 아래쪽으로 전달됨). 취소 신호는 컨텍스트가 취소 될 때 닫히는 (읽을 수있는) 채널을 반환하는 함수를 통해 구현됩니다. 이것은 컨텍스트를 파이프 라인과 취소 동시성 패턴 또는 타임 아웃을 구현하는 매우 효율적인 방법으로 만든다.

관습 적으로 컨텍스트를 취하는 함수는 첫 번째 인수 ctx context.Context 집니다. 이것은 단지 관습 일 뿐이지 만, 많은 정적 분석 도구가이 인수를 특별히 찾은 이후로 따라야 할 것이기 때문입니다. 컨텍스트는 인터페이스이기 때문에 기존의 컨텍스트와 유사한 데이터 (요청 호출 체인을 통해 전달되는 값)를 일반 Go 컨텍스트로 전환하고 몇 가지 방법을 구현하여 역 호환 방식으로 사용할 수도 있습니다. 또한 컨텍스트는 동시 액세스에 안전하므로 두려움없이 여러 goroutine에서 사용할 수 있습니다 (병렬 스레드 또는 동시 병행 실행 여부).

더 읽을 거리

유향 그래프로 표현 된 컨텍스트 트리

다음과 같이 Go 코드에서 작성된 간단한 컨텍스트 트리 (요청 범위가 될 수 있고 컨텍스트에 포함될 수있는 몇 가지 공통 값 포함)

// Pseudo-Go
ctx := context.WithValue(
    context.WithDeadline(
        context.WithValue(context.Background(), sidKey, sid),
        time.Now().Add(30 * time.Minute),
    ),
    ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())

다음과 같은 방향 그래프로 표현할 수있는 트리입니다.

유향 그래프로 표현 된 컨텍스트

각 하위 컨텍스트는 상위 컨텍스트의 값에 액세스하므로 데이터 액세스는 트리에서 위쪽으로 흐릅니다 (검정색 모서리로 표시). 반면 취소 신호는 트리 아래로 이동합니다 (컨텍스트가 취소되면 모든 자식도 취소됩니다). 상쇄 신호 흐름은 회색 에지로 표시됩니다.

컨텍스트를 사용하여 작업 취소

타임 아웃 (또는 취소 기능 포함)이있는 컨텍스트를 장시간 실행중인 함수에 전달하면 해당 함수 작업을 취소 할 수 있습니다.

ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
        // Do an iteration of some long running work here!
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow