Heim > Backend-Entwicklung > Golang > Wie kann man aktive Goroutinen in Go genau zählen und verwalten?

Wie kann man aktive Goroutinen in Go genau zählen und verwalten?

DDD
Freigeben: 2024-11-28 18:21:11
Original
998 Leute haben es durchsucht

How to Accurately Count and Manage Active Goroutines in Go?

So zählen und zeigen Sie die Anzahl aktiver Goroutinen an

In diesem Code haben wir eine Warteschlange und eine Funktionsdefinition, die sowohl das Entfernen als auch das Einreihen in die Warteschlange durchführt:

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
}
Nach dem Login kopieren

Es gibt jedoch keine Möglichkeit, die aktuelle Anzahl der Aktiven auszudrucken goroutines.

Verwendung von runtime.NumGoroutine

Es gibt zwar eine Möglichkeit, die Gesamtzahl der aktiven Goroutinen mithilfe von runtime.NumGoroutine zu ermitteln, dies ist jedoch nicht der beste Ansatz. Dies liegt daran, dass die Schleifen weiterhin Goroutinen erzeugen, was zu unnötigem CPU-Verbrauch führt.

Ein besserer Ansatz: Verwendung einer Sync.WaitGroup

Ein effizienterer Ansatz ist die Verwendung einer sync.WaitGroup, die Lässt uns die Anzahl der aktiven Goroutinen verfolgen.

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
}
Nach dem Login kopieren

Hier beginnen wir mit vier Goroutinen und warten, bis sie fertig sind Arbeit, bevor die Warteschlange geschlossen wird. Dieser Ansatz bietet eine sauberere und kontrollierte Möglichkeit, die Anzahl der aktiven Goroutinen zu verwalten.

Das obige ist der detaillierte Inhalt vonWie kann man aktive Goroutinen in Go genau zählen und verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage