GO · 고루틴/채널
errgroup 패턴
golang.org/x/sync/errgroup으로 고루틴 그룹의 에러를 수집합니다. 하나라도 실패하면 전체를 취소합니다.
고루틴/채널고급errgrouperrorgoroutinecontext
핵심 설명
golang.org/x/sync/errgroup으로 고루틴 그룹의 에러를 수집합니다. 하나라도 실패하면 전체를 취소합니다.
Go code
package main
import (
"context"
"fmt"
"sync"
)
// errgroup 간단 구현
type ErrGroup struct {
wg sync.WaitGroup
mu sync.Mutex
err error
ctx context.Context
cancel context.CancelFunc
}
func WithContext(ctx context.Context) (*ErrGroup, context.Context) {
ctx, cancel := context.WithCancel(ctx)
return &ErrGroup{ctx: ctx, cancel: cancel}, ctx
}
func (g *ErrGroup) Go(fn func() error) {
g.wg.Add(1)
go func() {
defer g.wg.Done()
if err := fn(); err != nil {
g.mu.Lock()
if g.err == nil { g.err = err }
g.mu.Unlock()
g.cancel()
}
}()
}
func (g *ErrGroup) Wait() error {
g.wg.Wait()
return g.err
}
func main() {
g, ctx := WithContext(context.Background())
urls := []string{"url1", "url2", "url3"}
for _, url := range urls {
g.Go(func() error {
select {
case <-ctx.Done():
return ctx.Err()
default:
fmt.Println("처리:", url)
return nil
}
})
}
if err := g.Wait(); err != nil {
fmt.Println("에러:", err)
}
}학습 팁
실무에서는 golang.org/x/sync/errgroup을 직접 사용하세요. SetLimit(n)으로 동시성도 제한할 수 있습니다.
주의할 점
errgroup에서 context를 사용하지 않으면 한 고루틴이 실패해도 나머지가 계속 실행됩니다.
자주 묻는 질문
errgroup 패턴란 무엇인가요?
golang.org/x/sync/errgroup 으로 고루틴 그룹의 에러를 수집합니다. 하나라도 실패하면 전체를 취소합니다.
errgroup 패턴 학습 시 주의할 점은 무엇인가요?
errgroup 에서 context를 사용하지 않으면 한 고루틴이 실패해도 나머지가 계속 실행됩니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.