İçeriğe geç

WaitGroup Yanlış Kullanımı (ARCH5037)

Anahtar go.async.waitgroup-misuse · Önem warning · Kategori async

sync.WaitGroup yanlış kullanımı: wg.Add goroutine başlatılmadan önce değil de içinde çağrılırsa Wait ile yarış oluşur; defer wg.Done() eksikse panik durumunda Wait sonsuza kadar asılı kalır.

func RunAll(tasks []func()) {
var wg sync.WaitGroup
for _, t := range tasks {
go func(fn func()) {
wg.Add(1) // launch'tan sonra; Wait'i kaçırabilir
fn()
}(t)
}
wg.Wait()
}
func RunAll(tasks []func()) {
var wg sync.WaitGroup
for _, t := range tasks {
wg.Add(1)
go func(fn func()) {
defer wg.Done()
fn()
}(t)
}
wg.Wait()
}

wg.Add(1)’i goroutine’i başlatmadan önce çağırın ve goroutine başında defer wg.Done() kullanın.