Maison >développement back-end >Golang >Comment pouvons-nous fermer une chaîne en toute sécurité une fois que tous les Goroutines ont fini d'utiliser un WaitGroup ?

Comment pouvons-nous fermer une chaîne en toute sécurité une fois que tous les Goroutines ont fini d'utiliser un WaitGroup ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-22 05:57:13714parcourir

How Can We Safely Close a Channel After All Goroutines Have Completed Using a WaitGroup?

Fermer la chaîne après la fin de Goroutine avec WaitGroup

Lorsque vous travaillez avec des chaînes et des goroutines, il est essentiel de fermer la chaîne une fois que toutes les goroutines sont terminées. Cela empêche toute communication ultérieure sur le canal et permet une gestion gracieuse des ressources.

Le code fourni tente d'implémenter ce comportement, mais est confronté à des limitations dues aux conditions de concurrence. Pour relever ces défis, nous pouvons utiliser le type sync.WaitGroup.

Le WaitGroup nous permet de créer un ensemble de tâches et d'attendre qu'elles se terminent avant de poursuivre l'exécution. Dans le cadre de la fermeture d'un canal, nous pouvons utiliser un WaitGroup pour garantir que le canal est fermé uniquement lorsque toutes les goroutines ont fini de l'utiliser.

Un extrait de code amélioré utilisant un WaitGroup :

import (
    "sync"
)

// ...

var wg sync.WaitGroup
for i := 0; i <= 10; i++ {
    wg.Add(1)
    go func() {
        result := calculate()
        c <- result
        wg.Done()
    }()
}

// Close the channel when all goroutines are finished
go func() {
    wg.Wait()
    close(c)
}()

for result := range c {
    all_result = append(all_result, result...)
}

Dans ce code mis à jour, nous employons un WaitGroup pour suivre le nombre de goroutines en attente. Chaque goroutine exécutant la tâche incrémente le compteur WaitGroup, indiquant qu'elle a démarré. Une fois terminée, chaque goroutine décrémente le compteur WaitGroup, indiquant qu'elle est terminée. Une goroutine distincte attend sur le WaitGroup et ferme le canal une fois que toutes les goroutines ont signalé leur achèvement.

Cette approche garantit une fermeture synchronisée et fiable du canal, évitant ainsi les problèmes rencontrés dans le code d'origine. Il élimine également le besoin d'appels en veille et d'attente occupée, offrant ainsi une solution plus efficace et plus robuste.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn