Sobes.tech
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.