Maison > développement back-end > Golang > Comment compter et gérer avec précision les Goroutines actives dans Go ?

Comment compter et gérer avec précision les Goroutines actives dans Go ?

DDD
Libérer: 2024-11-28 18:21:11
original
1001 Les gens l'ont consulté

How to Accurately Count and Manage Active Goroutines in Go?

Comment compter et afficher le nombre de Goroutines actives

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
}
Copier après la connexion

Cependant, il n'y a aucun moyen d'imprimer le nombre actuel d'actifs goroutines.

Utilisation de runtime.NumGoroutine

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 meilleure approche : utiliser un Sync.WaitGroup

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(&amp;wg, queue)
    }
    wg.Wait()
    close(queue)
    fmt.Println("list len", len(queue)) //this must be 0
}
Copier après la connexion

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!

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