Sobes.tech
Junior — Middle

Πώς μπορεί κανείς να σταματήσει αναγκαστικά πολλές τρέχουσες goroutines σε Go;

sobes.tech AI

Απάντηση από AI

Στη Go, για να σταματήσετε αναγκαστικά πολλές τρέχουσες goroutines, συνήθως χρησιμοποιείται ο μηχανισμός ακύρωσης μέσω του context (context.Context`).

Βασική ιδέα:

  • Δημιουργείται ένα context με ακύρωση (context.WithCancel ή context.WithTimeout).
  • Κάθε goroutine λαμβάνει αυτό το context και ελέγχει περιοδικά αν έχει ακυρωθεί.
  • Όταν καλείται η λειτουργία ακύρωσης (cancel()), όλες οι goroutines λαμβάνουν το σήμα και μπορούν να τερματίσουν σωστά.

Παράδειγμα:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d τερματίστηκε\n", id)
                return
            default:
                // εργασία goroutine
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Μετά από κάποιο χρόνο, τερματίζουμε όλες τις goroutines
time.Sleep(1 * time.Second)
cancel()

// Περιμένουμε να ολοκληρωθούν (π.χ. με sync.WaitGroup)

Αυτή η προσέγγιση επιτρέπει τον κεντρικό έλεγχο του τερματισμού πολλών goroutines και αποφεύγει προβλήματα με ανεξέλεγκτο τερματισμό.