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() 는 첫 번째 에러만 반환합니다. 모든 에러를 수집하려면 채널이나 뮤텍스로 직접 수집해야 합니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.