Sobes.tech
Junior — Middle

Πώς μπορεί να διακοπεί σωστά μια τρέχουσα goroutine, εάν είναι απαραίτητο να ολοκληρωθεί με βάση ένα εξωτερικό σήμα ή συνθήκη, ακόμη και αν το αποτέλεσμα δεν έχει ακόμη ληφθεί;

sobes.tech AI

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

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

Παράδειγμα με χρήση του πλαισίου:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Λήφθηκε σήμα ακύρωσης, τερματίζουμε το goroutine
            return
        default:
            // Εκτελούμε εργασία
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // Σε κάποιο σημείο, καλούμε το cancel() για να σταματήσει το goroutine
    cancel()
}

Αυτή η προσέγγιση επιτρέπει στο goroutine να ελέγχει τακτικά αν έχει σταλεί σήμα διακοπής και να τερματίζει σωστά, ακόμα και αν το αποτέλεσμα δεν έχει ακόμη ληφθεί. Ομοίως, μπορεί να χρησιμοποιηθεί κανάλι για τη μετάδοση του σήματος διακοπής, αλλά το context είναι πιο ιδιωματικό και βολικό τρόπο στο Go.