Sobes.tech
Senior

Ce se întâmplă dacă transmiți contextul original al cererii HTTP în GoRoutine?

sobes.tech AI

Răspuns de la AI

Dacă transmiteți contextul original (context.Context) al unei solicitări HTTP într-o gorutină separată, atunci când acest context este anulat sau expiră (de exemplu, când clientul închide conexiunea sau timpul de așteptare expiră), contextul din gorutină va fi, de asemenea, anulat. Acest lucru poate duce la întreruperea neașteptată a muncii gorutinei dacă aceasta depinde de acest context.

Prin urmare, dacă gorutina trebuie să funcționeze independent de ciclul de viață al solicitării HTTP, este recomandat să creați un context separat (de exemplu, folosind context.Background() sau context.WithCancel()) pentru a evita terminarea prematură. În caz contrar, utilizarea contextului original este utilă pentru gestionarea corectă a duratei de viață a operațiunilor legate de solicitare.

Exemplu:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Această gorutină se va termina dacă ctx este anulat
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Lucru finalizat")
        case <-ctx.Done():
            fmt.Println("Context anulat")
        }
    }(ctx)
    w.Write([]byte("Răspuns trimis"))
}