Maison >développement back-end >Golang >Comment puis-je compter et gérer efficacement les Goroutines actives dans Go ?

Comment puis-je compter et gérer efficacement les Goroutines actives dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-10 07:09:13841parcourir

How Can I Efficiently Count and Manage Active Goroutines in Go?

Comptage des goroutines actives

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!

Déclaration:
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