Middle — Middle+
Jak implementuješ jemné zastavení služby nebo aplikace, aby se zachovalo aktuální stav a ukončilo bez ztráty dat?
sobes.tech AI
Odpověď od AI
Pro správné ukončení služby nebo aplikace v Go se obvykle používá zpracování signálů operačního systému (například SIGINT, SIGTERM) a kontext s možností zrušení (context.Context). To umožňuje správně dokončit aktuální operace, uložit stav a uvolnit zdroje.
Příklad:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Zpracování signálů pro jemné ukončení
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Obdržen signál ukončení, začínáme ukončování...")
cancel() // Zrušení kontextu
}()
// Spuštění hlavní logiky s podporou zrušení
run(ctx)
}
func run(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Uložit stav, uvolnit zdroje
fmt.Println("Ukládání stavu a ukončení")
time.Sleep(2 * time.Second) // simulace
return
default:
// Hlavní práce
fmt.Println("Pracuji...")
time.Sleep(1 * time.Second)
}
}
}
Tento přístup umožňuje správně ukončit práci, neztratit data a neukončovat operace násilím.