[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.Addwg.Wait를 사용하여 모든 고루틴이 완료될 때까지 대기하는 방법을 보여줍니다.

웨이트 그룹을 사용하면 병렬로 실행되는 고루틴들을 효과적으로 제어할 수 있으며, 복잡한 동시성 작업을 보다 쉽게 다룰 수 있게 됩니다.