Senior
Mi történik, ha az eredeti HTTP-kéréstartományt átadod a GoRoutine-nak?
sobes.tech MI
Válasz az MI-től
Ha az eredeti (context.Context) HTTP-kérést egy külön GoRoutine-nak továbbítja, akkor amikor ez a kontextus megszakad vagy lejár (például, amikor az ügyfél bezárja a kapcsolatot vagy lejár az időkorlát), akkor a GoRoutine-ben lévő kontextus is megszakad. Ez váratlan megszakításhoz vezethet, ha a goroutine ettől függ.
Ezért, ha a goroutine függetlenül kell működjön a HTTP-kérés életciklusától, érdemes külön kontextust létrehozni (például a context.Background() vagy a context.WithCancel() segítségével), hogy elkerüljük a korai befejezést. Ellenkező esetben, az eredeti kontextus használata hasznos az operációk életciklusának helyes kezeléséhez, amelyek a kéréshez kapcsolódnak.
Példa:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// Ez a goroutine akkor ér véget, ha a ctx megszakad
select {
case <-time.After(5 * time.Second):
fmt.Println("Munka befejeződött")
case <-ctx.Done():
fmt.Println("Kontekstus megszakadt")
}
}(ctx)
w.Write([]byte("Válasz küldve"))
}