Maison >développement back-end >Golang >Comment puis-je compter et gérer efficacement les Goroutines actives dans Go ?
Lors de la gestion simultanée de plusieurs goroutines, il est souvent nécessaire de surveiller le nombre de goroutines actives. Dans Go, la fonction native runtime.NumGoroutine() fournit ces informations.
Considérons l'exemple suivant :
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 has len", len(queue)) //this must be 0 }
Bien que ce code démontre l'utilisation des goroutines, il ne fournit pas de moyen pour compter le nombre de goroutines actives à un moment donné.
Pour résoudre ce problème, une approche plus efficace consiste à utiliser un sync.WaitGroup, qui coordonne l'achèvement de plusieurs goroutines.
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 has len", len(queue)) //this must be 0 }
Dans ce code modifié, le sync.WaitGroup est utilisé pour suivre le nombre de goroutines actives. Chaque goroutine décrémente le compteur une fois terminée, et la goroutine principale attend que toutes les goroutines aient fini de s'exécuter avant de continuer.
En tirant parti de runtime.NumGoroutine() ou du plus efficace sync.WaitGroup, les programmeurs Go peuvent surveiller et gérer efficacement les goroutines actives dans leurs applications.
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!