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") }
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!