Sobes.tech
Junior — Middle

Jak zakończyć działanie programu, gdy w bieżącym kontekście pojawia się żądanie jego zatrzymania?

sobes.tech AI

Odpowiedź od AI

W Go, aby poprawnie zakończyć program po żądaniu zatrzymania, zwykle używa się kontekstu (context.Context) z anulowaniem. Pozwala to na wysłanie sygnału anulowania do gorutyn i ich poprawne zakończenie.

Przykład:

package main

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

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

    // Śledzenie sygnałów systemowych do zatrzymania
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Odebrano sygnał zatrzymania")
        cancel() // wysyłanie sygnału anulowania do kontekstu
    }()

    // Uruchomienie pracy, która nasłuchuje kontekst
    work(ctx)
}

func work(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Zakończenie pracy")
            return
        default:
            fmt.Println("Pracujemy...")
            time.Sleep(1 * time.Second)
        }
    }
}

W ten sposób, po otrzymaniu sygnału systemowego, program poprawnie kończy wszystkie procesy i wychodzi.