Junior — Middle
Πώς μπορεί κανείς να διακόψει σωστά την εκτέλεση των goroutines χρησιμοποιώντας το context σε Go;
sobes.tech AI
Απάντηση από AI
Για να τερματίσετε σωστά τις goroutines σε Go, συχνά χρησιμοποιείται το πακέτο context. Δημιουργείται ένα context με δυνατότητα ακύρωσης (context.WithCancel), το οποίο περνάει στη goroutine. Μέσα στη goroutine, η κατάσταση του context ελέγχεται περιοδικά μέσω <-ctx.Done(). Όταν καλείται η λειτουργία ακύρωσης, το κανάλι Done() κλείνει και η goroutine μπορεί να τερματίσει σωστά.
Παράδειγμα:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Η goroutine τερματίστηκε")
return
default:
// εκτέλεση εργασίας
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// μετά από κάποιο χρόνο, τερματίζουμε τη goroutine
time.Sleep(time.Second)
cancel()
time.Sleep(time.Millisecond * 100) // για να προλάβει η goroutine να τερματίσει
}
Αυτή η προσέγγιση επιτρέπει το ασφαλές και ελεγχόμενο τερματισμό των goroutines χωρίς τη χρήση μη ασφαλών μεθόδων.