Wat gebeurt er als je de originele context van de HTTP-aanvraag doorgeeft aan een GoRoutine?
sobes.tech AI
Antwoord van AI
Als je de originele context (context.Context) van een HTTP-verzoek doorgeeft aan een aparte GoRoutine, wordt de context in die GoRoutine ook geannuleerd wanneer de oorspronkelijke context wordt geannuleerd of verloopt (bijvoorbeeld wanneer de client de verbinding sluit of de timeout verloopt). Dit kan leiden tot een onverwachte onderbreking van het werk van de goroutine als deze ervan afhankelijk is.
Daarom is het aan te raden om een aparte context te maken (bijvoorbeeld met context.Background() of context.WithCancel()) als de goroutine onafhankelijk van de levenscyclus van het HTTP-verzoek moet werken, om voortijdige beëindiging te voorkomen. Anders is het gebruik van de originele context handig om de levensduur van de operaties die met het verzoek verband houden correct te beheren.
Voorbeeld:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// Deze goroutine stopt als ctx wordt geannuleerd
select {
case <-time.After(5 * time.Second):
fmt.Println("Werk voltooid")
case <-ctx.Done():
fmt.Println("Context geannuleerd")
}
}(ctx)
w.Write([]byte("Antwoord verzonden"))
}