Sobes.tech
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)
        }
    }
}

Έτσι, κατά τη λήψη σήματος συστήματος, το πρόγραμμα τερματίζει σωστά όλες τις διαδικασίες και κλείνει.