Middle
¿Qué capacidades proporciona la creación de un contexto de datos hijo en Go?
sobes.tech AI
Respuesta de la IA
La creación de un contexto hijo (usando context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) ofrece las siguientes capacidades:
- Cancelación: Permite cancelar la ejecución de operaciones iniciadas en el contexto hijo sin afectar al padre. Esto se logra llamando a la función de cancelación devuelta al crear el contexto.
- Tiempo límite / Fecha límite: Limita el tiempo de ejecución de las operaciones. Si el tiempo expira antes de que la operación termine, el contexto se cancela automáticamente.
- Transmisión de valores: Permite transmitir valores específicos de la solicitud o de la operación hacia abajo en la cadena de llamadas (por ejemplo, identificador de solicitud, datos de autenticación), sin modificar la firma de las funciones.
- Jerarquía: Crea una estructura jerárquica de contextos. La cancelación del contexto padre cancela automáticamente todos sus contextos hijos.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Contexto padre, que se cancela en 3 segundos
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Aseguramos que el contexto padre será cancelado
// Crear un contexto hijo con cancelación
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Aseguramos que el contexto hijo será cancelado
// Función que espera la cancelación del contexto
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Este bloque se ejecutará cuando el contexto sea cancelado
fmt.Println("Gorutina hija cancelada:", ctx.Err())
}
}(childCtx) // Pasamos el contexto hijo a la gorutina
// Retardo artificial para demostrar la cancelación
time.Sleep(5 * time.Second)
fmt.Println("Programa terminado")
}
En este ejemplo, el contexto padre con timeout de 3 segundos cancelará automáticamente el contexto hijo, lo que provocará la finalización de la gorutina. El contexto hijo también podría cancelarse manualmente llamando a cancelChild(), antes de que expire el timeout del contexto padre.