Recent Comments
Link
Recent Posts
Today
Total
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
관리 메뉴

Study Memory Work

[Golang] go루틴 끝날 때 까지 대기하기 : sync.WaitGroup 본문

Programing/Go

[Golang] go루틴 끝날 때 까지 대기하기 : sync.WaitGroup

Hera Choi 2024. 1. 5. 15:50
func main() {
    var wg sync.WaitGroup
    go watchNamespaces()
    wg.Add(1)
    wg.Wait()
}

 

이 코드는 sync.WaitGroup을 사용하여 고루틴들이 작업을 완료할 때까지 기다리는 방법을 보여줍니다.

  1. sync.WaitGroup은 고루틴들이 완료될 때까지 기다리는 데 사용됩니다. 이는 병렬로 실행되는 고루틴들의 작업이 모두 끝날 때까지 메인 고루틴이 기다리도록 도와줍니다.
  2. wg.Add(1)은 WaitGroup에 1을 추가합니다. 이는 기다려야 하는 고루틴의 수를 나타냅니다. 여기서는 주로 메인 고루틴이 대기해야 하므로 1을 추가합니다.
  3. wg.Wait()은 WaitGroup이 0이 될 때까지 대기합니다. 현재 WaitGroup의 값이 0이 아니므로 이 코드는 여기서 블록됩니다. 고루틴이 추가된 상태에서 작업이 완료되지 않았으므로 Wait()는 계속해서 메인 고루틴을 블록합니다.

그러나 watchNamespaces()가 어떻게 동작하는지에 따라 실제로 이 코드가 동작하는 방식이 달라집니다. 만약 watchNamespaces()가 고루틴에서 백그라운드에서 실행되고, wg.Done()을 호출하지 않는다면, Wait()는 영원히 블록될 것입니다.

따라서 watchNamespaces() 내부에서 언제 wg.Done()을 호출하여 WaitGroup의 값을 감소시키는지 확인하는 것이 중요합니다. 이것이 없으면 메인 고루틴은 영원히 대기 상태에 머무를 수 있습니다.

 

고루틴 함수 내에 wg.Done() 를 사용하여 wg add한 값을 감소 시켜주어야 함. add 값과 wg.Done() 갯수가 일치해야 프로그램이 정상 종료. wg.Done()을 사용하지 않으면 main은 영원히 ing~