WithCancel y WithTimeout
Creación de contextos cancelables y con límite de tiempo
WithCancel y WithTimeout es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
context.WithCancel
WithCancel deriva un nuevo contexto con una función de cancelación. Al llamar a cancel, se cierra el canal Done del contexto derivado y de todos sus contextos secundarios.
ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)Utilice siempre defer cancel
Si no llama a cancel, se filtra la goroutine que supervisa el contexto principal. Utilice siempre defer cancel inmediatamente después de crear un contexto cancelable.
context.WithTimeout
WithTimeout deriva un contexto que se cancela automáticamente después de la duración indicada. Es una envoltura práctica de WithDeadline.
ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
// err may be context.DeadlineExceeded
}Comprobación de Err()
Después de que Done se cierre, ctx.Err() devuelve el motivo: context.Canceled (cancelado explícitamente) o context.DeadlineExceeded (tiempo de espera agotado).
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
log.Println("timeout")
}Cancelar desde otra goroutine
La función de cancelación se puede llamar de forma segura desde cualquier goroutine y simultáneamente desde varias goroutines. Solo la primera llamada tiene efecto.
ctx, cancel := context.WithCancel(context.Background())
go func() {
if detectError() { cancel() }
}()Tiempo de espera de una solicitud HTTP
Establezca un tiempo de espera por solicitud con WithTimeout sobre el contexto de la solicitud entrante:
func handler(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
result, err := service.Call(ctx)
// ...
}Cancelación en cascada
Si se cancela un contexto principal, todos los contextos derivados (secundarios y nietos) se cancelan automáticamente, deteniendo todas las goroutines del árbol de llamadas.
Context en las pruebas
Utilice context.Background() o context.WithTimeout en las pruebas para garantizar que las goroutines iniciadas por ellas tengan una duración limitada.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)Propagar el contexto mediante bibliotecas
Pase siempre el contexto recibido a las llamadas salientes (consultas a bases de datos, llamadas HTTP y RPC). Nunca lo descarte ni lo sustituya, a menos que tenga un motivo específico para restablecer la fecha límite.
Crear un contexto para una tarea en segundo plano
Para las tareas en segundo plano que no estén vinculadas a una solicitud, utilice context.Background() como raíz y añada un WithCancel para poder detener la tarea correctamente.
select con Done
Incluya siempre ctx.Done() en un select junto con el canal de trabajo para evitar bloqueos cuando el contexto se cancele antes de que termine el trabajo.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}Comprobación rápida
¿Cuál es la diferencia entre context.WithCancel y context.WithTimeout?
Repaso: WithCancel y WithTimeout
Puntos clave:
- Utilice siempre defer cancel() justo después de crear el contexto
- WithTimeout se cancela automáticamente después de una duración y devuelve DeadlineExceeded
- ctx.Err() distingue entre Canceled y DeadlineExceeded
- La cancelación se propaga a todos los contextos derivados
Preguntas frecuentes
¿La lección «WithCancel y WithTimeout» es gratis?
Sí — el texto completo de «WithCancel y WithTimeout» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «WithCancel y WithTimeout»?
Creación de contextos cancelables y con límite de tiempo Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «WithCancel y WithTimeout»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué existe context.Context
- WithCancel y WithTimeout
- WithDeadline y WithValue
- Context en llamadas HTTP y de base de datos