Junior — Middle
Mi a különbség a wg.Add cikluson belüli használata és annak a ciklus előtti alkalmazása között a Go-ban történő szinkronizáció kontextusában?
sobes.tech MI
Válasz az MI-től
В 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 до запуска горутин, чтобы избежать потенциальных проблем с синхронизацией.