PHpullh
학습 라이브러리/Go/errgroup 패턴

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 메타데이터를 가집니다.