Sobes.tech
Senior

Que se passe-t-il si vous transmettez le contexte original de la requête HTTP à une GoRoutine?

sobes.tech IA

Réponse de l'IA

Si vous transmettez le contexte original (context.Context) d'une requête HTTP à une goroutine séparée, lorsque ce contexte est annulé ou expire (par exemple, lorsque le client ferme la connexion ou que le délai d'attente est dépassé), le contexte dans la goroutine sera également annulé. Cela peut entraîner une interruption inattendue du travail de la goroutine si elle dépend de ce contexte.

Par conséquent, si la goroutine doit fonctionner indépendamment du cycle de vie de la requête HTTP, il est conseillé de créer un contexte séparé (par exemple, en utilisant context.Background() ou context.WithCancel()) pour éviter une terminaison prématurée. Sinon, l'utilisation du contexte original est utile pour gérer correctement la durée de vie des opérations liées à la requête.

Exemple:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Cette goroutine se terminera si ctx est annulé
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Travail terminé")
        case <-ctx.Done():
            fmt.Println("Contexte annulé")
        }
    }(ctx)
    w.Write([]byte("Réponse envoyée"))
}