Sobes.tech
Senior

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"))
}