728x90

요약

 - 컨텍스트 : 고루틴에 작업을 요청할 때 작업 취소나 작업 시간 등을 설정할 수 있는 작업 명세서 역할

 

새로운 고루틴으로 작업을 시작할 때 일정 시간 동안만 작업을 지시하거나 외부에서 작업을 취소할 때 사용한다

또한 작업 설정에 관한 데이터를 전달할 수도 있다

 

작업 취소가 가능한 컨텍스트

// 작업이 취소될 때까지 1초마다 메시지를 출력하는 고루틴
package main

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

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	ctx, cancel := context.WithCancel(context.Background()) // 1. 컨텍스트 생성
	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")
		}
	}
}

// Tick 5번 출력

 

작업 시간을 설정한 컨텍스트

// 일정 시간동안만 작업을 지시할 수 있는 컨텍스트
package main

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

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 1. 컨텍스트 생성
	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")
		}
	}
}

// Tick 3번 출력

 

특정 값을 설정한 컨텍스트

// 컨텍스트에 특정 키로 값을 읽어올 수 있도록 설정할 수 있다
package main

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

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	ctx := context.WithValue(context.Background(), "number", 9) // 1. 컨텍스트 생성 (값 추가)
	ctx = context.WithValue(ctx, "float", 5.0)
	ctx = context.WithValue(ctx, "keyword", "Lilly")
	go print(ctx)

	wg.Wait()
}

func print(ctx context.Context) {
	if v := ctx.Value("number"); v != nil { // 2. 컨텍스트에서 값 읽기
		n := v.(int)
		fmt.Println("number:", n*n)
	}

	if v := ctx.Value("float"); v != nil { // 3. 컨텍스트에서 값 읽기
		n := v.(float64)
		fmt.Println("float:", n*n)
	}

	if v := ctx.Value("keyword"); v != nil { // 4. 컨텍스트에서 값 읽기
		n := v.(string)
		fmt.Println("keyword:", n)
	}

	wg.Done()
}

number: 81
float: 25
keyword: Lilly

 

책 참조 : Tucker의 Go언어 프로그래밍

728x90

'Basic Programming > Golang' 카테고리의 다른 글

Golang - 채널 / 셀렉트  (1) 2023.09.16
Golang - 슬라이스 정렬  (1) 2023.07.13
Golang - 슬라이스 요소 삭제/추가  (0) 2023.07.13
Golang - 슬라이스 복제  (0) 2023.07.13
Golang - Slicing  (0) 2023.07.13

+ Recent posts