當處理需要非同步處理的 URL 清單時,通常需要將並發 goroutine 的數量限制為防止資源過多。解決方案涉及創建一個有界通道來控制可以同時執行的 goroutine 的最大數量。
在原始嘗試中,創建了一個大小為並行的緩衝通道:
<code class="go">results := make(chan string, *parallel)</code>
目的是當結果通道已滿時,程式將阻塞,直到從通道讀取一個值,從而允許產生另一個goroutine。然而,這種方法並不能有效地限制 goroutine 的數量,因為當所有 URL 都處理完畢後,主程式不會阻塞。
更有效的解決方案是創建一個固定的工作協程的數量:
<code class="go">for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() }</code>
在此解決方案中,協程負責從通道取得URL 並處理它們。該通道從 feeder goroutine 中取得 URL,一旦檢索到所有 URL,feeder goroutine 就會關閉通道,並向工作執行緒發出訊號以完成任務。
一個單獨的 goroutine 監視工作執行緒的完成狀態goroutine,當所有工作人員完成後關閉結果通道。這種方法有效地將運行的 goroutine 數量限制為指定的並行計數。
以上是如何透過 Channel 有效限制並發 Go 例程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!