Sobes.tech
Junior — Middle

Чӣ гуна метавон иҷрои goroutine-ҳоро бо истифода аз контекст дар Go дуруст боздошт?

sobes.tech AI

Ҷавоб аз AI

Для σωστού τερματισμού των goroutine σε 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 να τερματίσει
}

Αυτή η προσέγγιση επιτρέπει την ασφαλή και ελεγχόμενη διακοπή των goroutine χωρίς τη χρήση μη ασφαλών μεθόδων.