In einem Szenario, in dem Sie eine Warteschlange mit gleichzeitigen Vorgängen haben, ist es wichtig, die Anzahl der aktiven Goroutinen zu überwachen. Dadurch wird sichergestellt, dass die richtige Anzahl von Goroutinen die Warteschlange bearbeitet, wodurch Leistung und Ressourcennutzung optimiert werden.
Das bereitgestellte Code-Snippet zeigt eine Schleife, die Goroutinen basierend auf der Anzahl der Elemente in einer Warteschlange erzeugt. Dieser Ansatz hat jedoch mehrere Nachteile:
Eine bessere Lösung besteht darin, einen Synchronisierungsmechanismus zu verwenden. Hier kommt eine WaitGroup zum Einsatz:
func deen(wg *sync.WaitGroup, queue chan int) { for element := range queue { wg.Done() 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) } } } 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 }
Dieser überarbeitete Code stellt sicher, dass die Anzahl der Goroutinen immer auf vier begrenzt ist, und schließt die Verarbeitung ab, sobald alle Elemente in der Warteschlange verarbeitet wurden. Dieser Ansatz behebt effektiv das Problem der übermäßigen Erstellung von Goroutinen und des CPU-Verbrauchs.
Das obige ist der detaillierte Inhalt vonWie kann man die Anzahl der aktiven Goroutinen in Go effektiv überwachen und steuern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!