Maison > développement back-end > Golang > Comment terminer une coroutine en golang

Comment terminer une coroutine en golang

(*-*)浩
Libérer: 2019-12-27 11:14:58
original
5076 Les gens l'ont consulté

Comment terminer une coroutine en golang

goroutine et Channel sont d'excellentes fonctionnalités du langage Go. Ils offrent une capacité de concurrence très légère et facile à utiliser. Mais quand il y a de nombreuses goroutines dans votre processus de candidature, comment attendre que toutes les goroutines sortent du processus principal ?

1 passez le signal de sortie via le canal (Apprentissage recommandé : GO )

La grande philosophie de conception de GO est la suivante : partager des données via Channel, et tandis que les données ne sont pas partagées via la mémoire partagée. Le processus principal peut envoyer un signal d'arrêt à n'importe quelle goroutine via le canal, comme ceci :

func run(done chan int) {
        for {
                select {
                case <-done:
                        fmt.Println("exiting...")
                        done <- 1
                        break
                default:
                }
 
                time.Sleep(time.Second * 1)
                fmt.Println("do something")
        }
}
 
func main() {
        c := make(chan int)
 
        go run(c)
 
        fmt.Println("wait")
        time.Sleep(time.Second * 5)
 
        c <- 1
        <-c
 
        fmt.Println("main exited")
}
Copier après la connexion

Cette méthode peut arrêter la goroutine gracieusement, mais lorsqu'il y a trop de goroutines, cette méthode n'aura pas l'air bien en termes de apparence du code. Cela semble encore maladroit dans la gestion.

2 Utiliser waitgroup

La structure Waitgroup dans le package de synchronisation est un bon outil pour la synchronisation entre plusieurs goroutines fournies par le langage Go. Voici la description du document officiel :

Normalement, nous utilisons waitgroup comme suit :

Créez une instance de Waitgroup, en supposant que nous l'appelons ici wg

appelle wg.Add(1) au démarrage de chaque goroutine. Cette opération peut être appelée avant le démarrage de la goroutine, ou elle peut être appelée à l'intérieur de la goroutine. Bien sûr, vous pouvez également appeler wg.Add(n)

avant de créer n goroutines. Une fois que chaque goroutine a terminé sa tâche, appelez wg.Done()

et appelez-la là où vous attendez. pour toutes les goroutines wg.Wait(), il se bloque avant que toutes les goroutines qui ont exécuté wg.Add(1) n'aient appelé wg.Done(), et il reviendra après que toutes les goroutines aient appelé wg.Done().

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal