Вызов Done
из нескольких подпрограмм безопасен и является рекомендуемым использованием WaitGroup
за документации .Причина вызова Add
из goroutine, которая порождает больше подпрограмм, не в том, что Add
не является поточно-ориентированным, а в том, что код может выглядеть так:
for ... {
go func() {
wg.Add(1)
defer wg.Done()
...
}()
}
wg.Wait()
Может попасть вwg.Wait()
до того, как будет выполнен любой из вызовов Add
, когда счетчик по-прежнему равен нулю, что наносит ущерб цели.Порядок выполнения параллельного кода недетерминирован.