Gleichzeitige Go-Routinen begrenzen
In Ihrem Code versuchen Sie, die Anzahl gleichzeitiger Goroutinen zu begrenzen. Die aktuelle Implementierung funktioniert jedoch nicht wie beabsichtigt. Hier ist ein alternativer Ansatz:
Lösung:
Anstatt für jede URL eine Goroutine zu erstellen, erstellen Sie eine feste Anzahl von Workern, die URLs aus einem gemeinsamen Kanal verarbeiten. Hier ist der geänderte Code:
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() // Workers get URLs from this channel urls := make(chan string) // Feed the workers with URLs go func() { for _, u := range flag.Args() { urls <- u } // Workers will exit from range loop when channel is closed close(urls) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of workers. for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() } // When workers are done, close results so that main will exit. go func() { wg.Wait() close(results) }() for res := range results { fmt.Println(res) }</code>
Erklärung:
Dies Der Ansatz stellt sicher, dass zu jedem Zeitpunkt ein Maximum an parallelen Goroutinen aktiv ist, wodurch die Parallelität wie gewünscht begrenzt wird.
Das obige ist der detaillierte Inhalt vonWie können gleichzeitige Go-Routinen effektiv eingeschränkt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!