Junior — Middle
Πώς μπορεί να τερματιστεί η εκτέλεση ενός προγράμματος όταν λαμβάνεται ένα αίτημα για διακοπή στη τρέχουσα κατάσταση;
sobes.tech AI
Απάντηση από AI
Στα Go, για σωστό τερματισμό ενός προγράμματος κατά το αίτημα διακοπής, συνήθως χρησιμοποιείται ένα πλαίσιο (context.Context) με ακύρωση. Αυτό επιτρέπει την αποστολή σήματος ακύρωσης στις goroutines και τον σωστό τερματισμό τους.
Παράδειγμα:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Παρακολούθηση σημάτων συστήματος για διακοπή
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Λήψη σήματος διακοπής")
cancel() // αποστολή σήματος ακύρωσης στο πλαίσιο
}()
// Εκκίνηση εργασίας που ακούει το πλαίσιο
work(ctx)
}
func work(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Ολοκλήρωση εργασίας")
return
default:
fmt.Println("Εργασία σε εξέλιξη...")
time.Sleep(1 * time.Second)
}
}
}
Έτσι, κατά τη λήψη σήματος συστήματος, το πρόγραμμα τερματίζει σωστά όλες τις διαδικασίες και κλείνει.