Go의 컨텍스트 이해

Go의 컨텍스트 이해

컨텍스트는 동시성을 가능하게 하는 Go의 중요한 기능 중 하나입니다. Go에서 “컨텍스트”는 API 경계를 넘어 요청 범위 값 및 취소 신호에 대한 기능을 제공하는 패키지를 의미합니다.

컨텍스트 패키지는 고루틴 개념을 기반으로 Go의 동시성 모델과 동시에 작동합니다. 고루틴은 효율적으로 만들고 관리할 수 있는 가벼운 실행 스레드로, Go에서 동시 프로그램을 쉽게 만들 수 있습니다.

컨텍스트 패키지

컨텍스트 패키지는 장기 실행 함수 또는 전체 호출 체인을 취소하는 기능을 제공합니다. 이 패키지는 또한 호출 체인 내 어디에서나 액세스할 수 있도록 요청 범위 값을 저장하는 데 도움이 됩니다. 이 기능은 요청이 여러 함수 호출에 걸쳐 있을 수 있고 요청을 취소하거나 특정 값을 첨부하려는 API 또는 마이크로 서비스로 작업할 때 편리합니다.

Go 프로그램에서 컨텍스트 패키지를 가져오는 방법은 다음과 같습니다.

import "context"

컨텍스트 함수는 컨텍스트 패키지의 컨텍스트 구조체 유형을 사용합니다. 일반적 으로 인스턴스 변수의 이름으로 ctx 를 사용해야 합니다.

func operations(ctx context.Context) {
}

함수는 다른 함수 및 작업에 대한 Context 구조체 유형을 반환할 수 있습니다.

func operations(ctx context.Context) context.Context {
}

context 패키지 의 TODO 기능 으로 새로운 context를 생성할 수 있습니다 . TODO 함수는 컨텍스트 취소 시 닫힐 채널 인 context.Done() 값으로 새 컨텍스트를 생성합니다. 컨텍스트가 필요하지만 부모 컨텍스트가 적합하지 않은 경우 이를 자리 표시자로 사용해야 합니다.

import "context"

func main() {
    ctx: = context.TODO()
}

또는 Background 함수는 값이 없고 비어 있는 Done 채널이 있는 새 컨텍스트를 만듭니다.

ctx: = context.Background()

컨텍스트 트리의 루트로 Background 기능을 사용해야 합니다.

값이 있는 컨텍스트

컨텍스트 패키지는 값 및 취소 신호를 전파하는 기능을 제공합니다. 요청 범위 데이터에서 취소 신호 및 기한까지의 정보에 대한 값을 사용할 수 있습니다.

컨텍스트 패키지를 사용하면 상위 컨텍스트에서 상속된 하위 컨텍스트를 생성할 수 있으므로 여러 함수를 통해 컨텍스트를 전달할 수 있으므로 프로그램 전체에서 값 및 취소 신호를 효율적으로 처리할 수 있습니다.

다음은 컨텍스트 패키지를 사용하여 함수를 통해 컨텍스트를 전달하는 예입니다.

import (
    "context"
)

func valuableContext(ctx context.Context) context.Context {
    return context.WithValue(ctx, "pass-key", "hfouneqcelkwfu")
}


func receiveContextData(ctx context.Context) any {
    passKey: = ctx.Value("pass-key")
    return passKey
}

valueContext 함수는 컨텍스트 인스턴스를 가져 오고 다음 함수에 대한 컨텍스트 인스턴스를 반환합니다. 컨텍스트 인스턴스는 WithValue 메서드 로 만든 값입니다 . WithValue 메서드는 함수와 키-값 쌍에서 컨텍스트 인스턴스를 가져옵니다.

컨텍스트에서 데이터를 검색하려면 TODO 또는 Background 함수를 사용하여 새 컨텍스트를 만들고 컨텍스트를 함수(이 경우에는 valueContext)에 전달하고 receiveContextData 함수를 사용하여 컨텍스트를 수신해야 합니다.

func main() {
    ctx: = context.Background()
    ctx = valuableContext(ctx)
    fmt.Println(receiveContextData(ctx))

}

ctx 변수는 Background 함수의 컨텍스트 인스턴스입니다. valueContext 함수는 ctx 변수를 받아 receiveContextData 함수가 가져온 값으로 컨텍스트를 반환하고 키-값 쌍에서 값을 반환합니다.

값 코드 결과별 컨텍스트

컨텍스트 시간 초과 및 기한

컨텍스트 패키지는 작업 의 제한 시간 및 기한을 설정하는 기능을 제공합니다. 시간 초과 및 기한을 설정하면 따라잡아야 하는 작업에 유용합니다.

제한 시간은 작업에 걸리는 시간입니다. 작업 시간 제한을 4초로 설정할 수 있습니다. 그 후 컨텍스트는 요청을 취소합니다.

반면 기한은 작업을 취소해야 하는 절대 지점을 정의합니다.

WithTimeout 메서드를 사용하여 컨텍스트 제한 시간을 설정할 수 있습니다 . 2초 제한 시간을 설정하는 방법은 다음과 같습니다.

func main() {
    ctx, cancel: = context.WithTimeout(context.Background(), 2 * time.Second)
    defer cancel()

    // some operation
}

main 함수 는 2초의 제한 시간으로 컨텍스트를 생성합니다. WithTimeout 함수는 기본 함수 종료 시 취소를 연기할 수 있는 취소 함수를 반환합니다.

WithDeadline 메서드 를 사용하여 기한을 선언할 수 있습니다 . WithDeadline 메서드는 컨텍스트 인스턴스와 최종 기한 시간을 사용합니다.

func doSomething(ctx context.Context) {
    deadlineTime: = time.Now().Add(1500 * time.Millisecond)
    ctx, ctxCancel: = context.WithDeadline(ctx, deadlineTime)
    defer ctxCancel()

    // some operation


    ctxCancel()
}

doSomething 함수는 컨텍스트를 가져오고, deadlineTime 변수컨텍스트 데드라인 이전의 시간입니다. ctx 변수는 기한이 있는 컨텍스트입니다 .

ctxCancel 변수 는 컨텍스트가 기한을 초과하면 컨텍스트를 취소합니다.

Go에서 컨텍스트를 사용하기 위한 모범 사례

컨텍스트를 전역 변수로 사용하지 마십시오. 컨텍스트를 전역 변수로 사용하면 예기치 않은 코드 동작과 추적하기 어려운 오류가 발생할 수 있으며 코드 복잡성을 줄이기 위해 컨텍스트를 아껴서 사용합니다.

마지막으로 컨텍스트를 보장이 아닌 신호로 사용하십시오. 컨텍스트를 취소한다고 해서 모든 고루틴의 실행이 중지되는 것은 아닙니다. 이것은 단지 신호일 뿐이며 고루틴은 컨텍스트에 구애받지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다