Junior — Middle
Jak zakończyć działanie programu, gdy w bieżącym kontekście pojawia się żądanie jego zatrzymania?
sobes.tech AI
Odpowiedź od AI
W Go, aby poprawnie zakończyć program po żądaniu zatrzymania, zwykle używa się kontekstu (context.Context) z anulowaniem. Pozwala to na wysłanie sygnału anulowania do gorutyn i ich poprawne zakończenie.
Przykład:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Śledzenie sygnałów systemowych do zatrzymania
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Odebrano sygnał zatrzymania")
cancel() // wysyłanie sygnału anulowania do kontekstu
}()
// Uruchomienie pracy, która nasłuchuje kontekst
work(ctx)
}
func work(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Zakończenie pracy")
return
default:
fmt.Println("Pracujemy...")
time.Sleep(1 * time.Second)
}
}
}
W ten sposób, po otrzymaniu sygnału systemowego, program poprawnie kończy wszystkie procesy i wychodzi.