Sobes.tech
Junior — Middle

Come si può forzare l'arresto di più goroutine in esecuzione in Go?

sobes.tech AI

Risposta dell'AI

In Go, per fermare forzatamente più goroutine in esecuzione, si utilizza generalmente il meccanismo di cancellazione tramite il contesto (context.Context).

Idea principale:

  • Si crea un contesto con cancellazione (context.WithCancel o context.WithTimeout).
  • Ogni goroutine riceve questo contesto e verifica periodicamente se è stato cancellato.
  • Quando si chiama la funzione di cancellazione (cancel()), tutte le goroutine ricevono il segnale e possono terminare correttamente.

Esempio:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d fermata\n", id)
                return
            default:
                // lavoro della goroutine
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Dopo un po' di tempo, fermiamo tutte le goroutine
time.Sleep(1 * time.Second)
cancel()

// Aspettiamo che terminino (ad esempio, usando sync.WaitGroup)

Questo approccio permette di gestire centralmente l'arresto di più goroutine ed evitare problemi di terminazione incontrollata.