Senior
Kas notiek, ja nododat sākotnējo HTTP pieprasījuma kontekstu GoRoutine?
sobes.tech AI
Atbilde no AI
Ja jūs pārsūtāt oriģinālo (context.Context) HTTP pieprasījuma kontekstu uz atsevišķu GoRoutine, tad, kad šis konteksts tiks atcelts vai beigsies (piemēram, kad klients aizver savienojumu vai beidzas gaidīšanas laiks), arī konteksts GoRoutine tiks atcelts. Tas var novest pie negaidītas gorutinas darba pārtraukšanas, ja tā ir no tā atkarīga.
Tādēļ, ja gorutina ir jāstrādā neatkarīgi no HTTP pieprasījuma dzīves cikla, ieteicams izveidot atsevišķu kontekstu (piemēram, ar context.Background() vai context.WithCancel()), lai izvairītos no priekšlaicīgas beigas. Pretējā gadījumā, oriģinālā konteksta izmantošana ir noderīga, lai pareizi pārvaldītu ar pieprasījumu saistīto operāciju dzīves ilgumu.
Piemērs:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// Šī gorutina beigsies, ja ctx tiks atcelts
select {
case <-time.After(5 * time.Second):
fmt.Println("Darbs pabeigts")
case <-ctx.Done():
fmt.Println("Konteksts atcelts")
}
}(ctx)
w.Write([]byte("Atbilde nosūtīta"))
}