限制並發 Go 例程
在您的程式碼中,您嘗試限制並發 goroutine 的數量。然而,目前的實現並沒有如預期般運作。這是另一種方法:
解決方案:
不要為每個URL 建立一個goroutine,而是建立固定數量的工作執行緒來處理來自共用通道的URL。以下是修改後的程式碼:
<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>
說明:
這方法確保在任何給定時間最多有並行 goroutine 處於活動狀態,從而根據需要限制並發性。
以上是如何有效限制Go例程並發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!