Sobes.tech
Junior — Middle

Ako možno ukončiť vykonávanie programu, keď je v aktuálnom kontexte požiadavka na jeho zastavenie?

sobes.tech AI

Odpoveď od AI

V jazyku Go sa na správne ukončenie programu na požiadanie o zastavenie zvyčajne používa kontext (context.Context) s možnosťou zrušenia. To umožňuje odoslať signál zrušenia gorutinám a ich správne ukončiť.

Príklad:

package main

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

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

    // Sledovanie systémových signálov na zastavenie
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Prijatý signál zastavenia")
        cancel() // odoslanie signálu zrušenia do kontextu
    }()

    // Spustenie práce, ktorá počúva kontext
    work(ctx)
}

func work(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Ukončenie práce")
            return
        default:
            fmt.Println("Pracujeme...")
            time.Sleep(1 * time.Second)
        }
    }
}

Týmto spôsobom, keď systém pošle signál, program správne ukončí všetky procesy a ukončí sa.