Golang의 `sync.WaitGroup` 이해
Lukas Schneider
DevOps Engineer · Leapcell

Key Takeaways
sync.WaitGroup
은 여러 고루틴을 효율적으로 동기화하는 데 도움을 줍니다.Add
,Done
, 그리고Wait
는 고루틴 실행과 완료를 제어합니다.- 올바른 사용법은 경쟁 조건을 방지하고 프로그램 안정성을 보장합니다.
Go를 사용한 동시 프로그래밍에서는 여러 고루틴의 동기화를 관리하는 것이 중요합니다. Go 표준 라이브러리의 sync.WaitGroup
은 고루틴 컬렉션이 실행을 완료할 때까지 기다리는 간단하고 효과적인 방법을 제공합니다. 이 기사에서는 sync.WaitGroup
의 기능, 사용법 및 내부 작동 방식을 자세히 설명합니다.
sync.WaitGroup
이란 무엇인가?
sync.WaitGroup
은 고루틴이 다른 고루틴에서 실행되는 작업 세트가 완료될 때까지 기다릴 수 있도록 하는 동기화 기본 요소입니다. 지정된 모든 고루틴이 완료될 때까지 프로그램 실행을 차단하는 방법을 제공합니다.
sync.WaitGroup
의 주요 메서드
WaitGroup
은 세 가지 주요 메서드를 제공합니다.
-
Add(delta int)
: 지정된delta
만큼 기다릴 고루틴 수를 조정합니다. 양수 값은 새 고루틴이 추가되고 있음을 나타내고 음수 값은 고루틴이 완료되었음을 나타냅니다. -
Done()
: 카운터를 1씩 감소시켜 고루틴이 작업을 완료했음을 나타냅니다. 이는 기본적으로Add(-1)
의 약칭입니다. -
Wait()
: 카운터가 0이 될 때까지 호출 고루틴의 실행을 차단합니다. 즉, 모든 고루틴이 작업을 완료했음을 의미합니다.
sync.WaitGroup
사용
다음은 WaitGroup
사용 방법을 보여주는 기본 예제입니다.
package main import ( "fmt" "sync" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) // Simulate work fmt.Printf("Worker %d done\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() }
이 예제에서:
WaitGroup
변수wg
가 선언되었습니다.Add
메서드는 각 고루틴에 대해 카운터를 1씩 증가시킵니다.- 각
worker
함수는 완료 시Done
을 호출하여 카운터를 감소시킵니다. Wait
메서드는 모든 고루틴이 완료될 때까지 main 함수를 차단합니다.
WaitGroup
의 내부 메커니즘
내부적으로 WaitGroup
은 활성 고루틴 수를 추적하기 위해 카운터를 유지 관리합니다. Add
메서드는 이 카운터를 수정하고 Done
은 이를 감소시킵니다. Wait
메서드는 카운터가 0에 도달할 때까지 차단합니다. 이 메커니즘은 메인 고루틴이 생성된 모든 고루틴이 완료될 때까지 기다렸다가 진행하도록 보장합니다.
중요한 고려 사항
-
Add
및Wait
호출의 일관성:Add
및Wait
에 대한 호출이 동시에 실행되지 않도록 합니다. 경쟁 조건을 방지하려면 고루틴을 시작하기 전에Add
를 호출하는 것이 좋습니다. -
음수 카운터 방지: 카운터가 음수가 되지 않아야 합니다. 균형을 유지하려면 각
Add
호출에 해당하는Done
호출이 있어야 합니다. -
재사용성:
WaitGroup
은 이전의 모든 고루틴이 완료되었고 새로운Add
호출이 이루어지지 않았는지 확인되지 않은 경우Wait
메서드가 반환된 후 재사용해서는 안 됩니다.
결론
sync.WaitGroup
은 Go 동시성 모델의 강력한 도구로, 여러 고루틴을 동기화하는 간단한 방법을 제공합니다. 해당 메서드와 올바른 사용법을 이해함으로써 개발자는 동시 작업을 효과적으로 관리하여 프로그램이 진행되기 전에 모든 고루틴이 작업을 완료하도록 할 수 있습니다.
FAQs
카운터가 음수가 될 수 없으므로 패닉이 발생합니다.
예, 이전의 모든 고루틴이 새 고루틴을 추가하기 전에 완료된 경우에만 가능합니다.
경쟁 조건을 방지하고 모든 고루틴이 올바르게 계산되도록 하기 위해서입니다.
Go 프로젝트 호스팅을 위한 최고의 선택인 Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무료로 무제한 프로젝트 배포
- 사용량에 따라서만 비용을 지불하세요. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하세요.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있도록 자동 확장
- 운영 오버헤드가 제로이므로 구축에만 집중하세요.
Documentation에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ