Junior — Middle
Πώς μπορεί να σταματήσει η εκτέλεση μιας goroutine αν η αναμενόμενη τιμή δεν έχει φτάσει ακόμα;
sobes.tech AI
Απάντηση από AI
Στο Go, για να σταματήσετε μια goroutine που περιμένει μια τιμή, αλλά αυτή η τιμή μπορεί να μην φτάσει ποτέ, συνήθως χρησιμοποιούνται κανάλια με χρονικό όριο ή ένα πλαίσιο με ακύρωση.
Παράδειγμα με χρονικό όριο μέσω select και time.After:
select {
case val := <-ch:
// λάβαμε την τιμή, συνεχίζουμε
case <-time.After(time.Second * 5):
// χρονικό όριο, τερματίζουμε τη goroutine
}
Ένας άλλος τρόπος είναι να χρησιμοποιήσετε ένα πλαίσιο (context.Context), το οποίο μπορεί να ακυρωθεί από έξω:
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case val := <-ch:
// επεξεργασία val
case <-ctx.Done():
// τερματισμός της goroutine
}
}()
// κάπου στον κώδικα, καλούμε cancel() για να τερματίσουμε τη goroutine
Με αυτόν τον τρόπο, η goroutine δεν θα περιμένει επ' άπειρον και θα μπορεί να τερματίσει σωστά.