Sobes.tech
Junior — Middle

Come si può interrompere correttamente una goroutine in esecuzione, se è necessario che termini in base a un segnale esterno o una condizione, anche se il risultato non è ancora stato ottenuto?

sobes.tech AI

Risposta dell'AI

Per interrompere correttamente una goroutine in esecuzione tramite un segnale esterno o una condizione in Go, si utilizzano generalmente il contesto (context.Context) o i canali per trasmettere il segnale di cancellazione.

Esempio con utilizzo del contesto:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Segnale di cancellazione ricevuto, terminare la goroutine
            return
        default:
            // Eseguire il lavoro
        }
    }
}

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

    // In qualche momento, si chiama cancel() per fermare la goroutine
    cancel()
}

Questo approccio permette alla goroutine di verificare regolarmente se è stato inviato un segnale di stop e di terminare correttamente, anche se il risultato non è ancora stato ottenuto. In modo analogo, si può usare un canale per trasmettere il segnale di stop, ma context è un metodo più idiomatico e comodo in Go.