İçeriğe geç

Goroutine Sızıntısı (ARCH5033)

Anahtar go.async.goroutine-leak · Önem warning · Kategori async

Bir goroutine, bloke olan kanal gönder/al işleminde takılır ve select + context.Done() ile bir çıkış yolu yoksa asla sonlanmaz. Bu sızan goroutine’ler bellek ve kanal kaynaklarını tutmaya devam eder.

func Start(ch chan int) {
go func() {
for {
v := <-ch // gönderen durduğunda sonsuza dek bloke olur
process(v)
}
}()
}
func Start(ctx context.Context, ch chan int) {
go func() {
for {
select {
case v := <-ch:
process(v)
case <-ctx.Done():
return
}
}
}()
}

Goroutine döngüsüne select ile bir <-ctx.Done() çıkış dalı ekleyin.