Maison >développement back-end >Golang >Comment compter avec précision les Goroutines actives dans un programme Go simultané ?

Comment compter avec précision les Goroutines actives dans un programme Go simultané ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 15:16:14563parcourir

How to Accurately Count Active Goroutines in a Concurrent Go Program?

Comment compter et afficher le nombre de goroutines actives

Dans votre programme, vous souhaitez surveiller le nombre de goroutines actuellement actives tout en retirer et mettre en file d'attente une file d'attente. Pendant que vous avez fourni du code pour gérer votre file d'attente, vous avez demandé une méthode pour récupérer le nombre actuel de goroutines actives.

  • Runtime.NumGoroutine :
    runtime .NumGoroutine fournit un moyen de récupérer le nombre actuel de goroutines actives dans votre programme Go. Cependant, tenter d'utiliser cette approche dans votre implémentation actuelle peut conduire à des résultats incorrects, car vos boucles de génération de goroutines créeront continuellement de nouvelles goroutines.
  • Utilisation de WaitGroup :
    Une solution plus appropriée implique en utilisant un sync.WaitGroup. Un WaitGroup permet l'attente et la synchronisation de plusieurs goroutines. Initialisez un WaitGroup et transmettez-le à votre fonction goroutine. Chaque goroutine qui démarre le travail doit appeler wg.Add(1), et une fois terminé, wg.Done() doit être appelé pour décrémenter le nombre. La fonction Main() peut ensuite appeler wg.Wait() pour attendre la fin de toutes les goroutines.

Voici une version révisée de votre code utilisant WaitGroup :

import (
    "fmt"
    "sync"
)

var element int

func deen(wg *sync.WaitGroup, queue chan int) {
    for element := range queue {
        wg.Done() // Decrement the WaitGroup count upon completion
        fmt.Println("element is", element)
        if element%2 == 0 {
            fmt.Println("new element is", element)
            wg.Add(2) // Increment WaitGroup count for spawned goroutines
            queue <- (element*100 + 11)
            queue <- (element*100 + 33)
        }
    }
}

func main() {
    var wg sync.WaitGroup
    queue := make(chan int, 10)
    queue <- 1
    queue <- 2
    queue <- 3
    queue <- 0

    fmt.Println("initial active goroutines:", runtime.NumGoroutine())

    for i := 0; i < 4; i++ {
        wg.Add(1) // Increment WaitGroup count for each spawned goroutine
        go deen(&wg, queue)
    }

    wg.Wait() // Wait for all goroutines to complete
    close(queue)
    fmt.Println("final active goroutines:", runtime.NumGoroutine())
    fmt.Println("list length:", len(queue)) // Expect 0
}

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