O que acontece se passar o contexto original da requisição HTTP para uma GoRoutine?
sobes.tech IA
Resposta da IA
Se passar o contexto original (context.Context) de uma requisição HTTP para uma goroutine separada, quando esse contexto for cancelado ou expirar (por exemplo, quando o cliente fecha a conexão ou o tempo limite expira), o contexto na goroutine também será cancelado. Isso pode levar a uma interrupção inesperada do trabalho da goroutine se ela depender desse contexto.
Portanto, se a goroutine deve funcionar independentemente do ciclo de vida da requisição HTTP, é recomendável criar um contexto separado (por exemplo, usando context.Background() ou context.WithCancel()) para evitar uma finalização prematura. Caso contrário, usar o contexto original é útil para gerenciar corretamente o tempo de vida das operações relacionadas à requisição.
Exemplo:
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func(ctx context.Context) {
// Esta goroutine terminará se ctx for cancelado
select {
case <-time.After(5 * time.Second):
fmt.Println("Trabalho concluído")
case <-ctx.Done():
fmt.Println("Contexto cancelado")
}
}(ctx)
w.Write([]byte("Resposta enviada"))
}