Sobes.tech
Middle — Middle+

Kaip įgyvendini švelnų paslaugos ar programos sustabdymą, kad išsaugotum dabartinę būseną ir užbaigtum be duomenų praradimo?

sobes.tech AI

Atsakymas iš AI

Siekiant įgyvendinti švelnų paslaugos ar programos sustabdymą Go kalboje, dažnai naudojamas operacinės sistemos signalų (pvz., SIGINT, SIGTERM) apdorojimas ir konteksto su atšaukimu (context.Context) naudojimas. Tai leidžia teisingai užbaigti einamas operacijas, išsaugoti būseną ir atlaisvinti išteklius.

Pavyzdys:

package main

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

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

    // Signalo apdorojimas švelniam sustabdymui
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Gauta sustabdymo signalas, pradedame uždarymą...")
        cancel() // Konteksto atšaukimas
    }()

    // Paleisti pagrindinę logiką su atšaukimo palaikymu
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Išsaugoti būseną, atlaisvinti išteklius
            fmt.Println("Būsenos išsaugojimas ir uždarymas")
            time.Sleep(2 * time.Second) // simuliacija
            return
        default:
            // Pagrindinis darbas
            fmt.Println("Dirba...")
            time.Sleep(1 * time.Second)
        }
    }
}

Šis požiūris leidžia teisingai užbaigti darbą, nepasiklydant duomenų ir nepažeidžiant operacijų jėga.