Junior — Middle
Jak poprawnie zatrzymać wykonywanie goroutine'ów za pomocą kontekstu w Go?
sobes.tech AI
Odpowiedź od AI
Aby poprawnie zatrzymać goroutine w Go, często używa się pakietu context. Tworzy się kontekst z możliwością anulowania (context.WithCancel), który jest przekazywany do goroutine. Wewnątrz goroutine okresowo sprawdzany jest stan kontekstu przez <-ctx.Done(). Gdy wywołuje się funkcję anulowania, kanał Done() zostaje zamknięty, a goroutine może się poprawnie zakończyć.
Przykład:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Goroutine zatrzymana")
return
default:
// wykonywanie pracy
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// po pewnym czasie zatrzymujemy goroutine
time.Sleep(time.Second)
cancel()
time.Sleep(time.Millisecond * 100) // aby goroutine zdążyła się zakończyć
}
Takie podejście pozwala bezpiecznie i kontrolowanie kończyć goroutine bez użycia niebezpiecznych metod.