Все вопросы

35 Конкурентность

Как дождаться группы горутин?

sync.WaitGroup считает незавершённые задачи. Add(1) вызывают до go, в горутине ставят defer wg.Done(), в конце — wg.Wait(). Add внутри горутины опаздывает: Wait может проскочить раньше, чем счётчик увеличится.

Копировать WaitGroup нельзя: копия не знает про чужой счётчик. Передают указатель или держат группу в поле структуры, которую тоже не копируют после старта.

WaitGroup не передаёт результат и ошибку. Для этого рядом нужен канал или общая переменная под мьютексом.

Пример

Go

три задачи и один Wait

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            fmt.Println(i)
        }()
    }
    wg.Wait()
}