Senior
Co się dzieje, jeśli przekażesz oryginalny kontekst żądania HTTP do GoRoutine?
sobes.tech AI
Odpowiedź od AI
Jeśli przekażesz oryginalny kontekst (context.Context) żądania HTTP do osobnej gorutyny, to przy anulowaniu lub wygaśnięciu tego kontekstu (np. gdy klient zamknie połączenie lub upłynie czas oczekiwania), kontekst w gorutynie również zostanie anulowany. Może to prowadzić do nieoczekiwanego przerwania pracy gorutyny, jeśli od niego zależy.
Dlatego, jeśli gorutyna ma działać niezależnie od cyklu życia żądania HTTP, warto utworzyć osobny kontekst (np. za pomocą context.Background() lub context.WithCancel()), aby uniknąć przedwczesnego zakończenia. W przeciwnym razie, użycie oryginalnego kontekstu jest przydatne do poprawnego zarządzania czasem życia operacji związanych z żądaniem.
Przykład:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// Ta gorutyna zakończy się, jeśli ctx zostanie anulowany
select {
case <-time.After(5 * time.Second):
fmt.Println("Praca zakończona")
case <-ctx.Done():
fmt.Println("Kontekst anulowany")
}
}(ctx)
w.Write([]byte("Odpowiedź wysłana"))
}