Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Code Habit

[Go 언어] 컨텍스트 본문

카테고리 없음

[Go 언어] 컨텍스트

코드베어 2022. 11. 21. 22:30

컨텍스트(context)는 context 패키지에서 제공하는 기능으로 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서 역할을 합니다. 새로운 고루틴으로 작업을 시작할 때 일정 시간 동안만 작업을 지시하거나 외부에서 작업을 취소할 때 사용한다. 또한 작업 설정에 관한 데이터를 전달할 수도 있다. 

 

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	ctx, cancel := context.WithCancel(context.Background()) // 컨텍스트 생성
	go PrintEverySecond(ctx)
	time.Sleep(5 * time.Second)
	cancel() // 취소
	wg.Wait()
}

func PrintEverySecond(ctx context.Context) {
	tick := time.Tick(time.Second)
	for {
		select {
		case <-ctx.Done():
			wg.Done()
			return
		case <-tick:
			fmt.Println("Tick")
		}
	}
}

context.WithCancel 함수로 취소가능한 컨텍스트를 생성했다. 상위 컨텍스트를 넣으면 그 컨텍스트를 감싼 새로운 컨텍스트를 만들어준다. 상위 컨텍스트가 없으면 가장 기본적인 컨텍스트인 context.Background()를 넣어준다.

 

cancel() 함수로 작업 취소를 알리면 컨텍스트의 Done 채널에 시그널을 보내 작업자가 작업 취소를 할수 있도록 한다.

context가 완료될 때 Done() 채널에 시그널을 넣어 주고 wg.Done()을 호출하며 main()의 대기상태 wg.Wait()가 풀리며 프로그램이 종료된다.

 

다음과 같이 작업 시간을 설정 할 수 있다.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)

 

컨텍스트로 특정 값을 전달 할 수도 있는데 이는 키/값 형태로 전달 된다.

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	ctx := context.WithValue(context.Background(), "number", 9) // key : "number", value : 9 형태로 전달된다.
	go square(ctx)

	wg.Wait()
}

func square(ctx context.Context) {
	if v := ctx.Value("number"); v != nil {
		n := v.(int)
		fmt.Printf("Square:%d", n*n)
	}
	wg.Done()
}

context.WithValue의 인수로 "number", 9를 key 와 value로 전달한다. ctx.Value("number")로 "number"키에 대한 Value를 가져온다. 이때 반환되는 값은 빈 인터페이스 타입으로 v.(int) 처럼 타입 변환하여 사용하여야 한다.

 

취소도 가능하고 값도 설정할 수 있는 컨텍스트는 상위 컨텍스트를 넣었던 인수 자리에 이미 만들어진 컨텍스트 객체를 넣어가면서 만들 수 있다. 

ctx, cancel := context.WithCancel(context.Background())
ctx = context.WithValue(ctx, "number", 9)
ctx = context.WithValue(ctx, "keyword", "Js")

context.WithValue() 에 이미 만들어진 컨텍스트(ctx)를 넣어 작업명세를 덧붙이고 있다.

 

**출처 : Tucker의 Go 언어 프로그래밍