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



