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 }
Es gibt jedoch keine Möglichkeit, die aktuelle Anzahl der Aktiven auszudrucken goroutines.
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 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(&wg, queue) } wg.Wait() close(queue) fmt.Println("list len", len(queue)) //this must be 0 }
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!