>백엔드 개발 >Golang >Golang 컨텍스트 사용법에 대한 심층적인 소개

Golang 컨텍스트 사용법에 대한 심층적인 소개

PHPz
PHPz원래의
2023-04-11 09:14:041263검색

Golang은 효율성과 단순성을 갖춘 강력한 프로그래밍 언어이며 현재 빠르게 발전하고 있습니다. Go 코드를 작성할 때 각 함수의 입력 및 출력 매개변수에는 고유한 수명 주기가 있습니다. 여러 고루틴이 동시에 실행될 때 프로그램의 정확성을 보장하기 위해 컨텍스트를 관리해야 할 수도 있습니다. 이것이 Golang 컨텍스트의 역할입니다. 이번 글에서는 Golang context의 사용법을 소개하겠습니다.

1. Golang Context의 개념

Golang Context는 요청 범위 내에서 관련 값을 포함하는 객체입니다. 이 객체는 함수 간에 전달될 수 있으며 취소 작업을 지원합니다. 예를 들어, Http 요청을 처리할 때 컨텍스트 패키지를 사용하여 Http 요청을 매개변수로 전달하여 요청 관련 컨텍스트를 얻을 수 있습니다.

Golang Context의 구조 정의는 다음과 같습니다.

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}

위 구조의 정의에는 Deadline, Done, Err 및 Value 메소드가 포함됩니다. 아래에서 해당 기능을 하나씩 소개하겠습니다.

2. Golang 컨텍스트 사용

  1. Deadline 메서드

Deadline 메서드는 시간과 부울 값을 반환합니다. 컨텍스트가 취소되거나 기한에 도달하면 컨텍스트는 이번 시간과 부울 값 true를 반환하고, 그렇지 않으면 false를 반환합니다. 일부 컨텍스트에는 최종 기한이 없으며, 이 경우 Deadline 메서드는 false를 반환합니다.

func main() {
    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*5))
    defer cancel()
    
    select {
    case <-time.After(3 * time.Second):
        fmt.Println("等待了3秒钟")
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }
}

위 코드에서는 먼저 마감일이 현재 시간으로부터 5초인 마감일을 사용하여 컨텍스트를 생성합니다. 그런 다음 select 문을 사용하여 3초 동안 대기합니다. 이때 대기 시간이 Deadline을 초과하지 않기 때문에 프로그램이 여전히 대기 중임을 알 수 있습니다. 마지막으로 마감 기한을 초과하면 ctx.Done()의 반환 값으로 인해 프로그램이 종료됩니다.

  1. Done 메소드

Done 메소드는 읽기 전용 채널을 반환합니다. 컨텍스트가 취소되거나 마감일에 도달하면 이 채널이 닫힙니다. 따라서 코드에서 select 문과 Done 메서드를 사용하여 컨텍스트의 상태를 모니터링할 수 있습니다.

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println(ctx.Err())
                return
            default:
                fmt.Println("goroutine正在运行中...")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)

    // 模拟耗时操作
    time.Sleep(5 * time.Second)
    cancel() // 取消Context
    time.Sleep(3 * time.Second)
    fmt.Println("main函数执行结束")
}

위 코드에서는 WithCancel 및 cancel 함수를 사용하여 Context를 시작 및 종료하고 Context가 취소될 때까지 고루틴에서 주기적으로 로그를 인쇄합니다. 동시에 Sleep을 사용하여 시간이 많이 걸리는 작업을 시뮬레이션합니다. 현재 함수는 5초 후에 취소 함수를 호출하여 Context를 종료하고 전체 프로그램을 종료합니다.

  1. Err 메소드

Err 메소드는 Context가 취소된 이유를 반환합니다. 취소된 컨텍스트의 경우 이 메서드는 null이 아닌 오류 값을 반환합니다. Context가 취소되지 않은 경우 Err 메서드는 nil을 반환합니다.

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println(ctx.Err())
                return
            default:
                fmt.Println("goroutine正在运行中...")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)

    // 模拟耗时操作
    time.Sleep(5 * time.Second)
    cancel() // 取消Context
    time.Sleep(3 * time.Second)
    fmt.Println("main函数执行结束")
}

위 코드에서는 취소 이유를 반환하는 Err 메서드가 고루틴에 사용되었습니다. 마지막으로 주 함수에 "주 함수 실행이 종료되었습니다"를 인쇄합니다.

  1. Value 메서드

Value 메서드는 인터페이스{} 유형의 객체인 Context와 관련된 값을 반환합니다. 컨텍스트에서 모든 유형의 값을 설정하고 Value 메서드를 사용하여 후속 작업에서 값을 가져올 수 있습니다.

type authKey string
func main() {
    ctx := context.WithValue(context.Background(), authKey("token"), "123456")
    fmt.Println(ctx.Value(authKey("token"))) // 打印"123456"
}

위 코드에서는 WithValue 메서드를 사용하여 문자열 유형 값을 Context와 연결하고 Value 메서드를 사용하여 값을 얻습니다.

3. 요약

Golang Context는 동시 코드 처리에 중요한 부분입니다. 함수들 사이에 Context를 전달함으로써 코드의 생명주기를 관리할 수 있고, Done, Err, Value 등의 메소드를 통해 Context의 상태를 모니터링할 수도 있습니다. Golang 컨텍스트 사용을 마스터하면 코드의 품질과 동시성을 향상시킬 수 있습니다.

위 내용은 Golang 컨텍스트 사용법에 대한 심층적인 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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