Senior
Mis juhtub, kui edastate HTTP päringu algse konteksti GoRoutine'ile?
sobes.tech AI
Vastus AI-lt
Kui te edastate HTTP-teenuse algse konteksti (context.Context) eraldi GoRoutine'ile, siis selle konteksti tühistamisel või aegumise korral (näiteks, kui klient sulgeb ühenduse või aeg lõpeb), tühistatakse ka see kontekst GoRoutine'is. See võib põhjustada ootamatu gorutina töö katkestamise, kui see sellest sõltub.
Seetõttu, kui gorutina peab töötama sõltumatult HTTP-teenuse elutsüklist, on soovitatav luua eraldi kontekst (näiteks kasutades context.Background() või context.WithCancel()), et vältida enneaegset lõpetamist. Muul juhul on algse konteksti kasutamine kasulik operatsioonide eluea õige haldamiseks, mis on seotud päringuga.
Näide:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// See goroutine lõpeb, kui ctx tühistatakse
select {
case <-time.After(5 * time.Second):
fmt.Println("Töö lõpetatud")
case <-ctx.Done():
fmt.Println("Kontekst tühistatud")
}
}(ctx)
w.Write([]byte("Vastus saadetud"))
}