GO · 고루틴/채널
타임아웃 패턴
채널과 time.After, context.WithTimeout으로 작업 타임아웃을 구현합니다.
고루틴/채널중급timeoutcontextselecttimer
핵심 설명
채널과 time.After, context.WithTimeout으로 작업 타임아웃을 구현합니다.
Go code
package main
import (
"context"
"fmt"
"time"
)
// 채널 기반 타임아웃
func fetchWithTimeout(timeout time.Duration) (string, error) {
ch := make(chan string, 1)
go func() {
time.Sleep(2 * time.Second) // 느린 작업 시뮬레이션
ch <- "데이터"
}()
select {
case result := <-ch:
return result, nil
case <-time.After(timeout):
return "", fmt.Errorf("타임아웃: %v", timeout)
}
}
// context 기반 타임아웃
func fetchWithContext(ctx context.Context) (string, error) {
ch := make(chan string, 1)
go func() {
time.Sleep(500 * time.Millisecond)
ch <- "빠른 응답"
}()
select {
case result := <-ch:
return result, nil
case <-ctx.Done():
return "", ctx.Err()
}
}
func main() {
// 1초 타임아웃 (2초 작업 → 타임아웃)
_, err := fetchWithTimeout(1 * time.Second)
fmt.Println(err) // 타임아웃
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
result, _ := fetchWithContext(ctx)
fmt.Println(result) // 빠른 응답
}학습 팁
context.WithTimeout은 defer cancel()을 반드시 호출하세요. 타이머 리소스가 누수됩니다.
주의할 점
time.After는 매번 새 타이머를 생성합니다. 루프에서 반복 사용하면 메모리 누수가 발생합니다. time.NewTimer를 재사용하세요.
자주 묻는 질문
타임아웃 패턴란 무엇인가요?
채널과 time.After , context.WithTimeout 으로 작업 타임아웃을 구현합니다.
타임아웃 패턴 학습 시 주의할 점은 무엇인가요?
time.After 는 매번 새 타이머를 생성합니다. 루프에서 반복 사용하면 메모리 누수가 발생합니다. time.NewTimer 를 재사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.