Junior — Middle
¿Cómo se puede detener de manera forzada varias goroutines que están en ejecución en Go?
sobes.tech AI
Respuesta de la IA
En Go, para detener varias goroutines en ejecución de manera forzada, generalmente se utiliza el mecanismo de cancelación a través del contexto (context.Context).
La idea principal:
- Se crea un contexto con cancelación (
context.WithCancelocontext.WithTimeout). - Cada goroutine recibe este contexto y verifica periódicamente si ha sido cancelado.
- Al llamar a la función de cancelación (
cancel()), todas las goroutines reciben la señal y pueden terminarse correctamente.
Ejemplo:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Goroutine %d detenida\n", id)
return
default:
// trabajo de la goroutine
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Después de un tiempo, detenemos todas las goroutines
time.Sleep(1 * time.Second)
cancel()
// Esperamos a que terminen (por ejemplo, usando sync.WaitGroup)
Este enfoque permite gestionar de manera centralizada la parada de varias goroutines y evita problemas con terminaciones descontroladas.