Junior — Middle
Kuo skiriasi wg.Add naudojimas ciklo viduje nuo jo taikymo prieš ciklą Go sinchronizacijos kontekste?
sobes.tech AI
Atsakymas iš AI
Go kalboje wg.Add padidina WaitGroup laukimo skaitiklį. Skirtumas tarp wg.Add iškvietimo ciklo viduje ir prieš jį:
- Iškvietus
wg.Addprieš ciklą: skaitiklis padidinamas vieną kartą bendrai paleidžiamų gorutinių skaičiui. Tai saugu ir rekomenduojama, nes skaitiklis iš anksto nustatomas.
wg.Add(3) // iš anksto padidiname skaitiklį
for i := 0; i < 3; i++ {
go func() {
defer wg.Done()
// darbas
}()
}
wg.Wait()
- Iškvietus
wg.Addciklo viduje: skaitiklis didėja kiekvienos iteracijos metu, tai taip pat veikia, bet gali sukelti lenktynių sąlygas, jei gorutinos paleidžiamos asinchroniškai ir kviečiaDonepriešAddiškvietimą visoms.
for i := 0; i < 3; i++ {
wg.Add(1) // didiname skaitiklį ciklo metu
go func() {
defer wg.Done()
// darbas
}()
}
wg.Wait()
Rekomendacija: geriau iškviesti wg.Add prieš paleidžiant gorutinas, kad išvengtumėte galimų sinchronizacijos problemų.