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"))
}