限制並發Goroutine 執行
考慮一個場景,您有一個要處理的URL 列表,並且想要限制運行的並發Goroutine 的數量。例如,如果您有 30 個 URL,您可能只需要 10 個並行工作的 goroutine。
提供的程式碼嘗試使用大小為 parallel 的緩衝通道來限制運行的 goroutine 數量。然而,這種方法在處理完所有 URL 後似乎並沒有阻塞。實現此並發限制的更有效方法是建立指定數量的工作 goroutine 並透過專用通道向它們提供 URL。
這是程式碼的改進版本:
<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>
在此更新的程式碼中,我們為每個允許的並發執行創建一個工作協程,這些工作協程從專用通道獲取URL。一旦所有 URL 都已分發,workerURLChan 就會關閉,這會在當前 URL 完成時觸發工作人員退出。這種機制有效限制了並發運行的 goroutine 數量。
以上是Go 中如何限制 Goroutine 並發執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!