Heim > Artikel > Backend-Entwicklung > Wie kann die gleichzeitige Goroutine-Ausführung in Go eingeschränkt werden?
Begrenzung der gleichzeitigen Ausführung von Goroutinen
Stellen Sie sich ein Szenario vor, in dem Sie eine Liste mit zu verarbeitenden URLs haben und die Anzahl der gleichzeitig ausgeführten Goroutinen begrenzen möchten . Wenn Sie beispielsweise 30 URLs haben, möchten Sie möglicherweise nur 10 Goroutinen parallel arbeiten.
Der bereitgestellte Code versucht, einen gepufferten Kanal der Größe parallel zu verwenden, um die Anzahl der ausgeführten Goroutinen zu begrenzen . Allerdings scheint dieser Ansatz nach der Verarbeitung aller URLs nicht zu blockieren. Eine effektivere Möglichkeit, diese Parallelitätsbeschränkung zu erreichen, besteht darin, eine bestimmte Anzahl von Worker-Goroutinen zu erstellen und ihnen über einen dedizierten Kanal URLs zuzuführen.
Hier ist eine verbesserte Version des Codes:
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() urls := flag.Args() // Create a channel to hold URLs that workers will consume workerURLChan := make(chan string) // Start a goroutine to feed URLs to the workers go func() { for _, u := range flag.Args() { workerURLChan <- u } // Once all URLs have been distributed, close the channel, which will cause workers to exit close(workerURLChan) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of worker goroutines for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() // Workers repeatedly fetch URLs from the channel until it is closed for url := range workerURLChan { worker(url, client, results) } }() } // Close the results channel when all workers have completed, which will allow the main goroutine to exit go func() { wg.Wait() close(results) }() // Receive and print results from the worker goroutines for res := range results { fmt.Println(res) }</code>
In diesem aktualisierten Code erstellen wir eine Worker-Goroutine für jede zulässige gleichzeitige Ausführung, und diese Worker rufen URLs vom dedizierten Kanal ab. Sobald alle URLs verteilt wurden, wird der workerURLChan geschlossen, was dazu führt, dass die Worker beendet werden, wenn ihre aktuelle URL abgeschlossen ist. Dieser Mechanismus begrenzt effektiv die Anzahl gleichzeitig ausgeführter Goroutinen.
Das obige ist der detaillierte Inhalt vonWie kann die gleichzeitige Goroutine-Ausführung in Go eingeschränkt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!