PHpullh
학습 라이브러리/Go/타임아웃 패턴

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.WithTimeoutdefer cancel()을 반드시 호출하세요. 타이머 리소스가 누수됩니다.

주의할 점

time.After는 매번 새 타이머를 생성합니다. 루프에서 반복 사용하면 메모리 누수가 발생합니다. time.NewTimer를 재사용하세요.

자주 묻는 질문

타임아웃 패턴란 무엇인가요?

채널과 time.After , context.WithTimeout 으로 작업 타임아웃을 구현합니다.

타임아웃 패턴 학습 시 주의할 점은 무엇인가요?

time.After 는 매번 새 타이머를 생성합니다. 루프에서 반복 사용하면 메모리 누수가 발생합니다. time.NewTimer 를 재사용하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.