首页 > 后端开发 > Golang > 正文

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

Barbara Streisand
发布: 2024-11-02 05:25:02
原创
778 人浏览过

How to Effectively Limit Concurrent Go Routines?

限制并发 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>
登录后复制

说明:

  • 创建一个缓冲通道 url,它将向工作人员提供 URL。
  • 一个单独的 goroutine 负责向 urls 通道提供提供的 URL。
  • 创建了所需数量的工作线程。每个工作线程从 urls 通道中提取 URL 并串行处理它们。
  • 当所有工作线程完成处理时,goroutine 关闭结果通道以表明所有结果已被检索。

这方法确保在任何给定时间最多有并行 goroutine 处于活动状态,从而根据需要限制并发性。

以上是如何有效限制Go例程并发?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!