Sobes.tech
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"))
}