Sobes.tech
Junior — Middle

Kaip sustabdyti goroutine vykdymą, jei laukiamoji reikšmė dar nepasiekta?

sobes.tech AI

Atsakymas iš AI

Go kalboje, norint sustabdyti gorutina, kuri laukia reikšmės, bet ši reikšmė gali ir nepasirodyti, dažniausiai naudojami kanalai su laiko limitu arba kontekstas su atšaukimu.

Pavyzdys su laiko limitu naudojant select ir time.After:

select {
case val := <-ch:
    // gauta reikšmė, tęsiame darbą
case <-time.After(time.Second * 5):
    // laiko limitas pasibaigė, stabdome gorutina
}

Kitas būdas – naudoti kontekstą (context.Context), kurį galima atšaukti iš išorės:

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

go func() {
    select {
    case val := <-ch:
        // apdoroti val
    case <-ctx.Done():
        // stabdyti gorutina
    }
}()

// kažkur kodo dalyje iškvieskite cancel(), kad sustabdytumėte gorutina

Šiuo būdu gorutina nesėdės begaliniame laukime ir galės tinkamai užbaigti darbą.