Maison >développement back-end >Golang >Comment fermer de manière fiable un canal Go une fois tous les Goroutines terminés ?

Comment fermer de manière fiable un canal Go une fois tous les Goroutines terminés ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 01:16:13359parcourir

How to Reliably Close a Go Channel After All Goroutines Finish?

Fermer une chaîne après la fin des goroutines

Lorsque vous travaillez avec des goroutines et des chaînes dans Go, il est souvent nécessaire de déterminer quand toutes les goroutines ont terminé exécuter et fermer le canal en conséquence. Deux approches courantes sont présentées dans la question : fermer explicitement le canal après la génération de goroutines et utiliser le comptage de threads.

Fermeture explicite du canal

La première approche consiste à fermer le canal après toutes les goroutines sont créées. Cependant, il est possible que le canal soit fermé prématurément, empêchant les goroutines d'envoyer leurs résultats.

Thread Counting

Dans la deuxième approche, un nombre de threads est maintenu, et le canal est fermé lorsque le compte atteint zéro. Bien que fonctionnel, il repose sur des appels en veille ou sur une attente occupée, ce qui peut s'avérer inefficace.

Solution Sync.WaitGroup

Un moyen plus efficace et plus fiable d'accomplir cette tâche est pour utiliser le type sync.WaitGroup. WaitGroup permet d'attendre un nombre spécifique de tâches, quel que soit leur ordre d'achèvement. Modifier l'exemple d'origine pour utiliser un WaitGroup ressemblerait à ceci :

import (
    "sync"
)

func main() {
    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...)
    }
}

Cette approche permet aux goroutines de terminer leurs tâches avant de fermer le canal, garantissant ainsi que tous les messages attendus sont reçus.

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