Dans ce code, nous avons une file d'attente et une fonction deen qui effectue à la fois la mise en file d'attente et la mise en file d'attente :
var element int func deen(queue chan int) { element := <-queue fmt.Println("element is ", element) if element%2 == 0 { fmt.Println("new element is ", element) queue <- (element*100 + 11) queue <- (element*100 + 33) } } func main() { queue := make(chan int, 10) queue <- 1 queue <- 2 queue <- 3 queue <- 0 for len(queue) != 0 { for i := 0; i < 2; i++ { go deen(queue) } } fmt.Scanln() fmt.Println("list is has len", len(queue)) //this must be 0 }
Cependant, il n'y a aucun moyen d'imprimer le nombre actuel d'actifs goroutines.
Bien qu'il existe un moyen d'obtenir le nombre total de goroutines actives en utilisant runtime.NumGoroutine, ce n'est pas la meilleure approche. En effet, les boucles continueront à générer des goroutines, ce qui entraînera une consommation inutile du processeur.
Une approche plus efficace consiste à utiliser un sync.WaitGroup, qui nous permet de suivre le nombre de goroutines actives.
func deen(wg *sync.WaitGroup, queue chan int) { for element := range queue { fmt.Println("element is ", element) if element%2 == 0 { fmt.Println("new element is ", element) wg.Add(2) queue <- (element*100 + 11) queue <- (element*100 + 33) } wg.Done() } } func main() { var wg sync.WaitGroup queue := make(chan int, 10) queue <- 1 queue <- 2 queue <- 3 queue <- 0 for i := 0; i < 4; i++ { wg.Add(1) go deen(&wg, queue) } wg.Wait() close(queue) fmt.Println("list len", len(queue)) //this must be 0 }
Ici, nous commençons avec quatre goroutines et attendons qu'elles terminer leur travail avant de fermer la file d'attente. Cette approche offre une manière plus propre et plus contrôlée de gérer le nombre de goroutines actives.
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!