Sobes.tech
Senior

Kas nutinka, jei perduosite pradinį HTTP užklausos kontekstą į GoRoutine?

sobes.tech AI

Atsakymas iš AI

Jei perduosite originalų HTTP užklausos (context.Context) kontekstą į atskirą GoRoutine, kai šis kontekstas bus atšauktas arba pasibaigs (pavyzdžiui, kai klientas uždarys ryšį arba pasibaigs laukimo laikas), kontekstas GoRoutine taip pat bus atšauktas. Tai gali sukelti netikėtą gorutinos darbo nutraukimą, jei ji nuo jo priklauso.

Todėl, jei gorutina turi veikti nepriklausomai nuo HTTP užklausos gyvavimo ciklo, rekomenduojama sukurti atskirą kontekstą (pavyzdžiui, naudojant context.Background() arba context.WithCancel()), kad išvengtumėte ankstyvo užbaigimo. Kitaip, originalaus konteksto naudojimas yra naudingas teisingam operacijų, susijusių su užklausa, gyvavimo laiko valdymui.

Pavyzdys:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Ši gorutina baigsis, jei ctx bus atšauktas
        select {
        case <-time.After(5 * time Sekundės):
            fmt.Println("Darbas baigtas")
        case <-ctx.Done():
            fmt.Println("Kontekstas atšauktas")
        }
    }(ctx)
    w.Write([]byte("Atsakymas išsiųstas"))
}