Sobes.tech
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.WithCancel o context.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.