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 και αποφεύγει προβλήματα με ανεξέλεγκτο τερματισμό.