Junior — Middle
Jak wymusić natychmiastowe zatrzymanie kilku działających goroutine w Go?
sobes.tech AI
Odpowiedź od AI
W Go, aby wymusić zatrzymanie kilku działających gorutyn, zwykle używa się mechanizmu anulowania za pomocą kontekstu (context.Context).
Główna idea:
- Tworzy się kontekst z możliwością anulowania (
context.WithCancellubcontext.WithTimeout). - Każda gorutyna przyjmuje ten kontekst i okresowo sprawdza, czy został anulowany.
- Po wywołaniu funkcji anulowania (
cancel()), wszystkie gorutyny otrzymują sygnał i mogą poprawnie się zakończyć.
Przykład:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Gorutyna %d zatrzymana\n", id)
return
default:
// praca gorutyny
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Po pewnym czasie zatrzymujemy wszystkie gorutyny
time.Sleep(1 * time.Second)
cancel()
// Czekamy na zakończenie (np. za pomocą sync.WaitGroup)
Taki sposób pozwala na scentralizowane zarządzanie zatrzymaniem wielu gorutyn i unikanie problemów z niekontrolowanym kończeniem.