首页  >  文章  >  后端开发  >  如何通过 Channel 有效限制并发 Go 例程?

如何通过 Channel 有效限制并发 Go 例程?

Barbara Streisand
Barbara Streisand原创
2024-11-03 08:45:29984浏览

How to Effectively Limit Concurrent Go Routines with Channels?

限制并发 Go 例程的数量

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn