Junior — Middle
Jak poprawnie zatrzymać uruchomioną gorutynę, jeśli konieczne jest, aby zakończyła się w zależności od zewnętrznego sygnału lub warunku, nawet jeśli wynik jeszcze nie został uzyskany?
sobes.tech AI
Odpowiedź od AI
Aby poprawnie zatrzymać działającą gorutynę na podstawie zewnętrznego sygnału lub warunku w Go, zazwyczaj używa się kontekstu (context.Context) lub kanałów do przekazywania sygnału anulowania.
Przykład z użyciem kontekstu:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Odebrano sygnał anulowania, kończymy gorutynę
return
default:
// Wykonujemy pracę
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// W pewnym momencie wywołujemy cancel() aby zatrzymać gorutynę
cancel()
}
Takie podejście pozwala gorutynie regularnie sprawdzać, czy został wysłany sygnał zatrzymania, i poprawnie się kończyć, nawet jeśli wynik jeszcze nie został uzyskany. Podobnie można użyć kanału do przekazywania sygnału zatrzymania, ale context jest bardziej idiomatycznym i wygodnym sposobem w Go.