Junior — Middle
Wat is het verschil tussen het gebruik van wg.Add binnen een lus en het gebruik ervan vóór de lus in de context van synchronisatie in Go?
sobes.tech AI
Antwoord van AI
В Go wg.Add увеличивает счетчик ожидания WaitGroup. Разница между вызовом wg.Add внутри цикла и перед циклом:
- Вызов
wg.Addперед циклом: счетчик увеличивается один раз на общее количество горутин, которые будут запущены. Это безопасно и рекомендуется, так как счетчик устанавливается заранее.
wg.Add(3) // заранее увеличиваем счетчик
for i := 0; i < 3; i++ {
go func() {
defer wg.Done()
// работа
}()
}
wg.Wait()
- Вызов
wg.Addвнутри цикла: счетчик увеличивается в каждой итерации, что тоже работает, но может привести к гонкам, если горутины запускаются асинхронно и вызываютDoneдо того, какAddбыл вызван для всех.
for i := 0; i < 3; i++ {
wg.Add(1) // увеличиваем счетчик в цикле
go func() {
defer wg.Done()
// работа
}()
}
wg.Wait()
Рекомендация: лучше вызывать wg.Add до запуска горутин, чтобы избежать потенциальных проблем с синхронизацией.