Sobes.tech
Senior

¿Qué sucede si pasas el contexto original de la solicitud HTTP a una GoRoutine?

sobes.tech AI

Respuesta de la IA

Si se pasa el contexto original (context.Context) de una solicitud HTTP a una goroutine separada, cuando se cancela o expira ese contexto (por ejemplo, cuando el cliente cierra la conexión o se agota el tiempo de espera), el contexto en la goroutine también será cancelado. Esto puede llevar a una interrupción inesperada del trabajo de la goroutine si depende de ese contexto.

Por lo tanto, si la goroutine debe funcionar independientemente del ciclo de vida de la solicitud HTTP, es recomendable crear un contexto separado (por ejemplo, usando context.Background() o context.WithCancel()) para evitar una finalización prematura. De lo contrario, usar el contexto original es útil para gestionar correctamente el tiempo de vida de las operaciones relacionadas con la solicitud.

Ejemplo:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    go func(ctx context.Context) {
        // Esta goroutine terminará si ctx se cancela
        select {
        case <-time.After(5 * time.Second):
            fmt.Println("Trabajo terminado")
        case <-ctx.Done():
            fmt.Println("Contexto cancelado")
        }
    }(ctx)
    w.Write([]byte("Respuesta enviada"))
}