Heim > Backend-Entwicklung > Golang > Wie kann man aktive Goroutinen in einem gleichzeitigen Go-Programm genau zählen?

Wie kann man aktive Goroutinen in einem gleichzeitigen Go-Programm genau zählen?

Linda Hamilton
Freigeben: 2024-12-07 15:16:14
Original
533 Leute haben es durchsucht

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

So zählen und zeigen Sie die Anzahl der aktiven Goroutinen an

In Ihrem Programm möchten Sie gleichzeitig die Anzahl der derzeit aktiven Goroutinen überwachen Aus der Warteschlange entfernen und in die Warteschlange einreihen. Während Sie Code zum Verwalten Ihrer Warteschlange bereitgestellt haben, haben Sie sich nach einer Methode zum Abrufen der aktuellen Anzahl aktiver Goroutinen erkundigt.

  • Runtime.NumGoroutine:
    runtime .NumGoroutine bietet eine Möglichkeit, die aktuelle Anzahl aktiver Goroutinen in Ihrem Go-Programm abzurufen. Der Versuch, diesen Ansatz in Ihrer aktuellen Implementierung anzuwenden, kann jedoch zu falschen Ergebnissen führen, da Ihre Goroutine-Spawner-Schleifen ständig neue Goroutinen erstellen.
  • Verwendung von WaitGroup:
    Eine geeignetere Lösung beinhaltet unter Verwendung einer sync.WaitGroup. Eine WaitGroup ermöglicht das Warten und Synchronisieren mehrerer Goroutinen. Initialisieren Sie eine WaitGroup und übergeben Sie sie an Ihre Goroutine-Funktion. Jede Goroutine, die mit der Arbeit beginnt, sollte wg.Add(1) aufrufen und nach Abschluss sollte wg.Done() aufgerufen werden, um die Anzahl zu verringern. Die Main()-Funktion kann dann wg.Wait() aufrufen, um auf den Abschluss aller Goroutinen zu warten.

Hier ist eine überarbeitete Version Ihres Codes mit 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
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man aktive Goroutinen in einem gleichzeitigen Go-Programm genau zählen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage