Junior — Middle
Kaip teisingai sustabdyti vykstančią goroutine, jei reikia, kad ji baigtųsi pagal išorinį signalą ar sąlygą, net jei rezultatas dar nepasiektas?
sobes.tech AI
Atsakymas iš AI
Norint teisingai sustabdyti veikiančią gorutininą pagal išorinį signalą ar sąlygą Go kalboje, dažnai naudojamas kontekstas (context.Context) arba kanalai signalo perdavimui.
Pavyzdys naudojant kontekstą:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Gauta atšaukimo signalas, užbaigiame gorutina
return
default:
// Atlikti darbą
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// Tam tikru momentu iškviečiame cancel() norėdami sustabdyti gorutina
cancel()
}
Šis požiūris leidžia gorutinei reguliariai tikrinti, ar buvo išsiųstas sustabdymo signalas, ir tinkamai užbaigti, net jei rezultatas dar nepasiekiamas. Panašiai galima naudoti kanalą signalo perdavimui, tačiau context yra idiomatiškesnis ir patogesnis būdas Go kalboje.