Middle — Middle+
Ako implementuješ nežno zaustavitev storitve ali aplikacije za shranjevanje trenutnega stanja in zaključek brez izgube podatkov?
sobes.tech AI
Odpoveď od AI
Na správne ukončenie služby alebo aplikácie v Go sa zvyčajne používa spracovanie signálov operačného systému (napríklad SIGINT, SIGTERM) a kontext s možnosťou zrušenia (context.Context). To umožňuje správne ukončiť aktuálne operácie, uložiť stav a uvoľniť zdroje.
Príklad:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Spracovanie signálov pre jemné ukončenie
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Prijatý signál na ukončenie, začíname zatváranie...")
cancel() // Zrušiť kontext
}()
// Spustenie hlavnej logiky s podporou zrušenia
run(ctx)
}
func run(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Uložiť stav, uvoľniť zdroje
fmt.Println("Ukladanie stavu a zatváranie")
time.Sleep(2 * time.Second) // simulácia
return
default:
// Hlavná práca
fmt.Println("Pracuje...")
time.Sleep(1 * time.Second)
}
}
}
Tento prístup umožňuje správne ukončiť prácu, bez straty dát a bez núteného prerušovania operácií.