Sobes.tech
Junior — Middle

Kaip galima užbaigti programos vykdymą, kai esame dabartiniame kontekste, kai yra prašymas sustabdyti jos darbą?

sobes.tech AI

Atsakymas iš AI

Go kalboje, norint teisingai užbaigti programą, kai yra prašymas ją sustabdyti, dažnai naudojamas kontekstas (context.Context) su atšaukimu. Tai leidžia siųsti atšaukimo signalą gorutinoms ir jas teisingai užbaigti.

Pavyzdys:

package main

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

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

    // Stebėti sisteminius signalus sustabdymui
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Gavome sustabdymo signalą")
        cancel() // siųsti atšaukimo signalą kontekstui
    }()

    // Pradėti darbą, kuris klausosi konteksto
    work(ctx)
}

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

Šiuo būdu, kai gaunamas sistemos signalas, programa teisingai užbaigia visus procesus ir išeina.