Sobes.tech
Middle — Middle+

Kuidas teostad pehme teenuse või rakenduse peatamise, et säilitada praegune olek ja lõpetada ilma andmete kaota?

sobes.tech AI

Vastus AI-lt

Et teha pehme teenuse või rakenduse lõpetamiseks Go keeles kasutatakse tavaliselt operatsioonisüsteemi signaalide (näiteks SIGINT, SIGTERM) töötlemist ja konteksti tühistamist (context.Context). See võimaldab õigesti lõpetada jooksvaid operatsioone, salvestada olekut ja vabastada ressursse.

Näide:

package main

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

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

    // Signaalide töötlemine pehmeks lõpetamiseks
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Lõpetussignaal received, alustame sulgemist...")
        cancel() // Konteksti tühistamine
    }()

    // Peamise loogika käivitamine tühistamise toetusega
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Salvestada olek, vabastada ressursid
            fmt.Println("Oleku salvestamine ja sulgemine")
            time.Sleep(2 * time.Second) // simulatsioon
            return
        default:
            // Peamine töö
            fmt.Println("Töötamine...")
            time.Sleep(1 * time.Second)
        }
    }
}

See lähenemine võimaldab õigesti lõpetada töö, ilma andmeid kaotamata ja operatsioone jõuga katkestamata.