[go] waitgroup을 활용한 동시성 작업 제어
고루틴과 웨이트 그룹은 고 언어의 강력한 동시성 기능을 효과적으로 활용하기 위해 사용됩니다. 웨이트 그룹은 고루틴이 모두 완료될 때까지 대기하거나 특정 개수의 고루틴이 완료될 때까지 대기하고자 할 때 사용됩니다.
웨이트 그룹 소개
웨이트 그룹은 sync
패키지에서 제공됩니다. 주요 메서드는 Add
, Done
, Wait
입니다. Add
메서드는 대기해야 하는 고루틴의 수를 추가합니다. Done
메서드는 고루틴이 완료되었음을 웨이트 그룹에 알립니다. Wait
메서드는 웨이트 그룹이 모든 고루틴이 완료될 때까지 대기하도록 만듭니다.
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 고루틴이 완료됨을 알림
fmt.Printf("Worker %d is done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 웨이트 그룹에 고루틴 1개 추가
go worker(i, &wg)
}
wg.Wait() // 모든 고루틴이 완료될 때까지 대기
fmt.Println("All workers have finished")
}
위의 예제에서 worker
함수는 wg.Done()
을 호출하여 고루틴이 완료되었음을 알리고, main
함수에서는 wg.Add
와 wg.Wait
를 사용하여 모든 고루틴이 완료될 때까지 대기하는 방법을 보여줍니다.
웨이트 그룹을 사용하면 병렬로 실행되는 고루틴들을 효과적으로 제어할 수 있으며, 복잡한 동시성 작업을 보다 쉽게 다룰 수 있게 됩니다.