Middle — Middle+
Jak realizujesz miękkie zatrzymanie usługi lub aplikacji w celu zapisania aktualnego stanu i zakończenia pracy bez utraty danych?
sobes.tech AI
Odpowiedź od AI
Aby zaimplementować łagodny sposób zatrzymania usługi lub aplikacji w Go, zazwyczaj korzysta się z obsługi sygnałów systemu operacyjnego (np. SIGINT, SIGTERM) oraz kontekstu z anulowaniem (context.Context). Pozwala to na poprawne zakończenie bieżących operacji, zapisanie stanu i zwolnienie zasobów.
Przykład:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Obsługa sygnałów dla łagodnego zatrzymania
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Odebrano sygnał zatrzymania, rozpoczynamy zamknięcie...")
cancel() // Anuluj kontekst
}()
// Uruchom główną logikę z obsługą anulowania
run(ctx)
}
func run(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Zapisz stan, zwolnij zasoby
fmt.Println("Zapis stanu i zamknięcie")
time.Sleep(2 * time.Second) // symulacja
return
default:
// Główna praca
fmt.Println("Pracuję...")
time.Sleep(1 * time.Second)
}
}
}
Ten sposób pozwala na poprawne zakończenie pracy, bez utraty danych i bez wymuszania przerwania operacji.