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ą.