Sobes.tech
Junior — Middle

¿Cómo se puede finalizar la ejecución de un programa cuando se realiza una solicitud para detener su trabajo en el contexto actual?

sobes.tech AI

Respuesta de la IA

En Go, para finalizar correctamente un programa al solicitar una parada, generalmente se usa un contexto (context.Context) con cancelación. Esto permite enviar una señal de cancelación a las goroutines y terminarlas correctamente.

Ejemplo:

package main

import (
    "context"
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

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

    // Seguimos las señales del sistema para detener
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Señal de parada recibida")
        cancel() // enviamos la señal de cancelación al contexto
    }()

    // Ejecutamos el trabajo que escucha el contexto
    work(ctx)
}

func work(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Finalizando trabajo")
            return
        default:
            fmt.Println("Trabajando...")
            time.Sleep(1 * time.Second)
        }
    }
}

De esta manera, al recibir la señal del sistema operativo, el programa finaliza correctamente todos los procesos y sale.