본문 바로가기
카테고리 없음

Golang Context

by 시바도지 2023. 3. 5.
반응형

Golang에서 Context는 동시성 및 네트워크 코드에서 사용되는 중요한 패턴이다.

이는 프로세스 내에서 실행 중인 코드 간의 정보 공유를 위한 작은 객체로 생각할 수 있다.

Context는 고루틴간 통신을 통해 전달된다.

Context는 여러 값을 보유할 수 있지만 일반적으로 다음과 같은 정보를 포함한다.

 

  • 요청 기한 (request deadline)
  • 취소 신호 (cancel signal)
  • 권한 (authentication)
  • 요청 범위 (request-scoped data)

 

일반적으로 Context는 함수의 인자로 전달되며, 실행 중인 함수의 하위 함수에 전달된다.

Context는 요청 범위의 데이터를 전달하며, 여러 함수를 통해 전달될 수 있다.

Context 패키지는 다양한 기본 메소드를 제공한다.

그 중에서도 가장 중요한 것은 WithCancelWithTimeout이다.

WithCancel 메소드는 취소 시그널을 생성하고, WithTimeout 메소드는 일정 시간 후에 취소 시그널을 생성한다.

 

다음은 예제 코드이다.

package main

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

func main() {
    ctx := context.Background()

    // WithCancel returns a copy of parent with a new Done channel
    // and cancelfunc
    ctx, cancel := context.WithCancel(ctx)

    go func() {
        time.Sleep(2 * time.Second)

        // cancel the context
        cancel()
    }()

    fmt.Println("waiting for 5 seconds")
    select {
    case <-time.After(5 * time.Second):
        fmt.Println("waited for 5 seconds")
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }
}

 

위 예시 코드는 2초 후에 Context를 취소한다.

그러면 5초를 기다리는 main 함수가 종료된다.

그러나 Context가 취소되면 main 함수에서 빠져나가고 에러 메시지를 출력한다.

이는 select문을 통해 이루어진다.

select문은 여러 채널을 기다리며, 하나라도 준비되면 해당 채널의 동작을 수행한다.

반응형

댓글