context

3598 단어 golang
1. 소개Context 단일 요청을 처리하는 여러 개의 goroutine 간에 요청 영역의 데이터, 취소 신호, 마감 시간 등과 관련된 조작을 간소화하는 데 사용되며, 이러한 조작은 여러 개의 API 호출과 관련이 있을 수 있다.서버에 전송된 요청은 상하문을 만들어야 하고, 서버에 대한 전송 호출은 상하문을 받아들여야 한다.이들 사이의 함수 호출 체인은 상하문을 전달해야 하거나WithCancel, WithDeadline, WithTimeout 또는 WithValue로 만든 파생 상하문을 사용할 수 있다.컨텍스트가 취소되면 파생된 모든 컨텍스트도 취소됩니다.
2. 사용 예
package main

import (
	"fmt"
	"time"
	"sync"
	"context"
)

var wg sync.WaitGroup
func f(ctx context.Context) {
	defer wg.Done()
LOOP:
	for {
		fmt.Println("hello")
		time.Sleep(time.Millisecond * 500)
		select {
		case 

인터페이스
type Context interface {
	Deadline() (deadline time.Time, ok bool)
	Done() 

인터페이스 이름
설명Deadline
현재 Context 취소된 시간, 즉 작업 완료 마감 시간 반환Done
하나Channel를 되돌려줍니다. 이 채널은 현재 작업이 완료되거나 상하문이 취소된 후에 닫히고 여러 번 호출Done 방법은 같은 채널로 되돌아옵니다.Err
현재 Context 로 되돌아오는 이유는 Done 되돌아오는 채널이 닫혔을 때만 비어 있지 않은 값을 되돌려줍니다.취소되면 Canceled 오류로 돌아갑니다.시간 초과가 반환됩니다 DeadlineExceeded 오류Value Context에서 반환 키에 대응하는 값은 같은 상하문에서 여러 번 호출Value하고 같은 Key에 전송하면 같은 결과를 반환합니다. 이 방법은 API와 프로세스 간 요청 영역의 데이터를 전달하는 데만 사용됩니다.
1. Background() 및 TODO()
Background()
TODO() Context 인터페이스를 구현한 backgroundContext 인터페이스를 구현한 todo주로 main 함수, 초기화 및 테스트 코드에서 Context라는 트리 구조의 맨 윗부분인 Context, 즉 루트 Context에 사용된다
어떤 Context를 사용해야 할지 모르겠을 때 이걸 사용해도 돼요.
코드에서 처음에는 이 두 개의 내장된 상하문 대상을 최상위층partent context으로 하고 더 많은 하위 상하문 대상을 파생시켰다. 취소할 수 없고 기한을 설정하지 않았으며 어떤 값도 가지고 있지 않은 Context였다.
2. WithCancel
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)

두 개의 값을 되돌려줍니다. 첫 번째는 취소 가능한 Context 값이고, 두 번째는 취소 신호를 촉발하는 함수입니다.취소 함수가 호출되면 대응하는 Context 값이 내부의 수신 채널을 닫고 채널이 닫히면 바로 되돌아옵니다. 바로 Done 방법이 되돌아오는 채널입니다.그리고 모든 하위 값에 취소 신호를 전달합니다.이 하위 값이 만약 하위 값이 있다면, 1급 1급으로 취소 신호를 전달할 것이다.마지막으로, 이 Context 값은 부모 값과의 연결을 끊습니다.
3. WithDeadline 및 WithTimeout
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

With Deadline 함수나 With Timeout 함수를 호출하여 생성된 Context 값도 취소할 수 있습니다.그것들은 수동으로 취소될 수 있을 뿐만 아니라, 생성이 정해진 기한이 지난 시간에 따라 자동으로 정시 취소될 수도 있다.이곳의 정시 취소 기능은 그들 내부의 타이머를 빌려 이루어진 것이다.기한이 지났을 때, 두 가지 Context 값의 행위는 수동 취소와 거의 일치하며, 단지 한 걸음 더 나아가 내부의 타이머를 멈추고 방출할 뿐이다.With Deadline과 With Timeout은 비슷합니다.모두 설정을 통해 어느 시간에 자동으로 터치됩니다.ctx입니다.Done () 은 값을 가져올 수 있습니다.차이점은 DeadLine은 시점을 설정하고 시간이 맞으면 만료된다는 것입니다.Timeout은 시간을 설정하는 것입니다. 예를 들어 몇 초, 이 시간이 지나면 시간을 초과합니다.사실 밑바닥 타임아웃도 Deadlin을 통해 이루어졌습니다.
4. WithValue
func WithValue(parent Context, key, val interface{}) Context

WithValue 함수에는 상위 값, 키 및 값 등 3개의 매개변수가 필요합니다.여기 키는 반드시 판단할 수 있는 사전과 유사한 키여야 한다.그러나 Context 값은 사전에 키와 값을 저장하는 것이 아니라 부모 값에 해당하는 필드에 간단하게 저장됩니다.Value 메서드를 통해 데이터를 얻을 수 있습니다.속성을 포함하는 Context 값의 Value 방법을 호출할 때 주어진 키를 판단하고 있으면 저장된 값을 되돌려줍니다. 그렇지 않으면 부모 값에서 계속 찾고 상하문 루트 노드의 방법을 따라 계속 찾습니다.다른 몇 가지 Context 값은 데이터를 휴대할 수 없기 때문에 Value 방법은 찾을 때 이 Context 값을 넘어갑니다.
Context 인터페이스는 데이터를 바꾸는 방법을 제공하지 않기 때문에 상하문 수에 데이터를 포함하는 Context 값을 추가하여 새로운 데이터를 저장하거나 이 값의 부모 값을 취소하여 해당하는 데이터를 버릴 수 있습니다.여기에 저장된 데이터가 외부에서 바뀔 수 있다면 안전을 자신해야 한다.
반환 값은 취소할 수 없습니다. 취소 신호가 전파될 때, 그것들을 만나면 직접 건너가고, 정보를 하위 값에 직접 전달하려고 합니다.

좋은 웹페이지 즐겨찾기