요약
- 컨텍스트 : 고루틴에 작업을 요청할 때 작업 취소나 작업 시간 등을 설정할 수 있는 작업 명세서 역할
새로운 고루틴으로 작업을 시작할 때 일정 시간 동안만 작업을 지시하거나 외부에서 작업을 취소할 때 사용한다
또한 작업 설정에 관한 데이터를 전달할 수도 있다
작업 취소가 가능한 컨텍스트
// 작업이 취소될 때까지 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언어 프로그래밍