Junior — Middle
Kako zaustaviti izvršavanje goroutine ako očekivana vrednost još nije dostignuta?
sobes.tech АИ
Одговор од АИ
U Go jeziku, za zaustavljanje gorutine koja čeka na vrednost, ali ta vrednost možda neće stići, obično se koriste kanali sa timeout-om ili kontekst sa otkazivanjem.
Primer sa timeout-om pomoću select i time.After:
select {
case val := <-ch:
// primljena vrednost, nastavljamo sa radom
case <-time.After(time.Second * 5):
// timeout, zaustavljamo gorutinu
}
Drugi način je korišćenje konteksta (context.Context), koji se može otkazati spolja:
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case val := <-ch:
// obraditi val
case <-ctx.Done():
// zaustaviti gorutinu
}
}()
// negde u kodu pozivamo cancel() da bismo zaustavili gorutinu
Na ovaj način, gorutina neće čekati beskonačno i može se pravilno završiti.