Sobes.tech
Senior

Cosa succede se si passa il contesto originale della richiesta HTTP a una GoRoutine?

sobes.tech AI

Risposta dell'AI

Se si passa il contesto originale (context.Context) di una richiesta HTTP a una goroutine separata, quando questo contesto viene cancellato o scade (ad esempio, quando il client chiude la connessione o scade il timeout), anche il contesto nella goroutine verrà cancellato. Ciò può portare a un'interruzione imprevista del lavoro della goroutine se dipende da questo contesto.

Pertanto, se la goroutine deve funzionare indipendentemente dal ciclo di vita della richiesta HTTP, è consigliabile creare un contesto separato (ad esempio, usando context.Background() o context.WithCancel()) per evitare una terminazione prematura. Altrimenti, l'uso del contesto originale è utile per gestire correttamente il tempo di vita delle operazioni legate alla richiesta.

Esempio:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Questa goroutine terminerà se ctx viene cancellato
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Lavoro completato")
        case <-ctx.Done():
            fmt.Println("Contesto cancellato")
        }
    }(ctx)
    w.Write([]byte("Risposta inviata"))
}