Sobes.tech
Junior — Middle

Come si può interrompere correttamente l'esecuzione delle goroutine utilizzando il contesto in Go?

sobes.tech AI

Risposta dell'AI

Per fermare correttamente le goroutine in Go, si utilizza spesso il pacchetto context. Si crea un contesto con possibilità di cancellazione (context.WithCancel), che viene passato alla goroutine. All'interno della goroutine, lo stato del contesto viene verificato periodicamente tramite <-ctx.Done(). Quando si chiama la funzione di cancellazione, il canale Done() si chiude, e la goroutine può terminare correttamente.

Esempio:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine fermata")
            return
        default:
            // eseguire il lavoro
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // dopo un po' di tempo, fermare la goroutine
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // per permettere alla goroutine di terminare
}

Questo approccio consente di terminare le goroutine in modo sicuro e controllato senza utilizzare metodi non sicuri.