Sobes.tech
Junior — Middle

¿Cómo se puede detener correctamente la ejecución de goroutines utilizando context en Go?

sobes.tech AI

Respuesta de la IA

Para detener correctamente las goroutines en Go, a menudo se utiliza el paquete context. Se crea un contexto con la capacidad de cancelación (context.WithCancel), que se pasa a la goroutine. Dentro de la goroutine, se verifica periódicamente el estado del contexto a través de <-ctx.Done(). Cuando se llama a la función de cancelación, el canal Done() se cierra, y la goroutine puede finalizar correctamente.

Ejemplo:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine detenida")
            return
        default:
            // realizar trabajo
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // después de un tiempo, detener la goroutine
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // para que la goroutine tenga tiempo de terminar
}

Este enfoque permite terminar las goroutines de manera segura y controlada sin usar métodos inseguros.