sync.WaitGroup
여러 고루틴이 완료될 때까지 기다리기
sync.WaitGroup은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
목적
sync.WaitGroup은 여러 고루틴이 완료될 때까지 기다립니다. 주 고루틴은 Add를 호출하여 개수를 설정하고, 각 고루틴은 완료되면 Done을 호출하며, 개수가 0이 될 때까지 Wait가 차단됩니다.
기본 사용법
각 고루틴을 시작하기 전에 Add를 호출하고, 각 고루틴의 끝에서 defer를 통해 Done을 호출하며, 모든 고루틴을 시작한 후 Wait를 호출합니다.
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(v Item) {
defer wg.Done()
process(v)
}(item)
}
wg.Wait()고루틴이 시작되기 전에 Add를 호출해야 합니다
wg.Add(1)은 go func()보다 먼저 호출하고, 고루틴 내부에서는 절대 호출하지 마십시오. 그렇지 않으면 고루틴이 자신을 등록하기 전에 Wait가 반환될 수 있습니다.
흔한 실수: 반복 변수 캡처
모든 고루틴이 같은 변수를 공유하는 일을 피하려면 클로저를 통해서가 아니라 고루틴 함수의 인수로 반복 변수를 전달합니다.
for _, v := range items {
wg.Add(1)
go func(item Item) { // correct: copy
defer wg.Done()
process(item)
}(v)
}WaitGroup 재사용하기
WaitGroup은 Wait가 반환된 후 재사용할 수 있지만, 이전의 모든 Done 호출이 반환된 경우에만 가능합니다. 아직 반환되지 않은 Done 호출과 동시에 재사용하지 마십시오.
결과와 함께 사용하는 WaitGroup
WaitGroup은 결과를 수집하지 않습니다. 고루틴의 출력을 모으려면 채널이나 뮤텍스를 사용한 슬라이스와 결합하십시오.
results := make([]Result, len(items))
for i, item := range items {
wg.Add(1)
go func(idx int, v Item) {
defer wg.Done()
results[idx] = process(v)
}(i, item)
}
wg.Wait()일괄 개수로 Add 호출하기
반복문 전에 한 번의 Add 호출로 전체 개수를 전달할 수 있으며, 이는 고루틴마다 Add를 한 번씩 호출하는 것보다 조금 더 효율적입니다.
wg.Add(len(items))
for _, item := range items {
go func(v Item) { defer wg.Done(); process(v) }(item)
}WaitGroup을 복사하지 마십시오
뮤텍스와 마찬가지로 WaitGroup은 처음 사용한 뒤 복사해서는 안 됩니다. 포인터로 전달하거나 포인터로 전달되는 구조체에 포함하십시오.
WaitGroup과 errgroup 비교
golang.org/x/sync/errgroup은 WaitGroup을 감싸고 오류 전파 기능을 추가합니다. 어느 고루틴에서든 오류가 발생하면 다른 고루틴도 중지해야 하는 경우 errgroup을 우선 사용하십시오.
context와 결합하기
errgroup.WithContext를 사용하면 WaitGroup의 의미와 첫 번째 오류 발생 시 취소되는 context를 함께 얻을 수 있어 모든 고루틴을 깔끔하게 중지할 수 있습니다.
g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
if err := g.Wait(); err != nil { log.Fatal(err) }영값을 사용할 수 있습니다
sync.WaitGroup의 영값은 바로 사용할 수 있으므로 생성자가 필요하지 않습니다. 선언한 다음 Add를 호출하면 됩니다.
빠른 확인
고루틴을 시작하기 전에 호출하지 않고 고루틴 내부에서 wg.Add(1)을 호출하면 어떻게 됩니까?
복습: sync.WaitGroup
핵심 사항:
- 고루틴을 시작하기 전에 Add를 호출하고, 고루틴 내부에서는 defer를 통해 Done을 호출합니다
- 개수가 0이 될 때까지 Wait가 차단됩니다
- 절대 복사하지 말고, 고루틴 내부에서 Add를 호출하지 마십시오
- 오류를 전파하려면 errgroup을 사용합니다
자주 묻는 질문
“sync.WaitGroup” 강의는 무료인가요?
네 — “sync.WaitGroup” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“sync.WaitGroup”에서 뭘 배우나요?
여러 고루틴이 완료될 때까지 기다리기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“sync.WaitGroup” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.