当处理需要异步处理的 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中文网其他相关文章!