PHpullh
학습 라이브러리/Go/errgroup — 고루틴 에러 처리

GO · 에러처리

errgroup — 고루틴 에러 처리

여러 고루틴의 에러를 하나로 모아 처리하는 errgroup 패키지.

에러처리중급errgroupgoroutineerrorcontextWait

핵심 설명

여러 고루틴의 에러를 하나로 모아 처리하는 errgroup 패키지.

Go code

// go get golang.org/x/sync/errgroup
package main

import (
	"context"
	"fmt"
	"golang.org/x/sync/errgroup"
	"time"
)

func fetchURL(ctx context.Context, url string) (string, error) {
	// 컨텍스트 취소 확인
	select {
	case <-ctx.Done():
		return "", ctx.Err()
	case <-time.After(100 * time.Millisecond):
	}
	if url == "bad-url" {
		return "", fmt.Errorf("fetch 실패: %s", url)
	}
	return "data:" + url, nil
}

func main() {
	// 기본 errgroup
	g := new(errgroup.Group)
	results := make([]string, 3)
	urls := []string{"url1", "url2", "url3"}

	for i, url := range urls {
		i, url := i, url // 캡처
		g.Go(func() error {
			data, err := fetchURL(context.Background(), url)
			if err != nil { return err }
			results[i] = data
			return nil
		})
	}

	if err := g.Wait(); err != nil {
		fmt.Println("에러:", err)
	} else {
		fmt.Println("결과:", results)
	}

	// context와 함께 — 하나 실패 시 나머지 취소
	g2, ctx := errgroup.WithContext(context.Background())
	badURLs := []string{"url1", "bad-url", "url3"}

	for _, url := range badURLs {
		url := url
		g2.Go(func() error {
			_, err := fetchURL(ctx, url)
			return err
		})
	}

	if err := g2.Wait(); err != nil {
		fmt.Println("그룹 에러:", err)
	}
}

학습 팁

errgroup.WithContext()는 첫 번째 에러 발생 시 컨텍스트를 자동으로 취소합니다. 나머지 고루틴이 ctx.Done()을 감지해 일찍 종료할 수 있습니다.

주의할 점

g.Wait()는 첫 번째 에러만 반환합니다. 모든 에러를 수집하려면 채널이나 뮤텍스로 직접 수집해야 합니다.

자주 묻는 질문

errgroup — 고루틴 에러 처리란 무엇인가요?

여러 고루틴의 에러를 하나로 모아 처리하는 errgroup 패키지.

errgroup — 고루틴 에러 처리 학습 시 주의할 점은 무엇인가요?

g.Wait() 는 첫 번째 에러만 반환합니다. 모든 에러를 수집하려면 채널이나 뮤텍스로 직접 수집해야 합니다.