Sobes.tech
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 δεν θα περιμένει επ' άπειρον και θα μπορεί να τερματίσει σωστά.