Sobes.tech
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.WithCancel lub context.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.