Sobes.tech
Junior — Middle

Kā apturēt goroutine izpildi, ja gaidāmajai vērtībai vēl nav sasniegts?

sobes.tech AI

Atbilde no AI

Go valodā, lai apturētu gorutīnu, kas gaida vērtību, bet šī vērtība var nenotikt, parasti izmanto kanālus ar laika ierobežojumu vai kontekstu ar atcelšanu.

Piemērs ar laika ierobežojumu, izmantojot select un time.After:

select {
case val := <-ch:
    // saņemta vērtība, turpinām darbu
case <-time.After(time.Second * 5):
    // laika ierobežojums beidzies, apturēt gorutīnu
}

Vēl viens veids ir izmantot kontekstu (context.Context), kuru var atcelt no ārpuses:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // apstrādāt val
    case <-ctx.Done():
        // apturēt gorutīnu
    }
}()

// kaut kur kodā izsauciet cancel(), lai apturētu gorutīnu

Tādējādi gorutīna nesēdēs bezgalīgi gaidījumā un varēs pareizi pabeigt darbu.