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

Go 中如何限制 Goroutine 并发执行?

Linda Hamilton
发布: 2024-11-02 05:27:02
原创
973 人浏览过

How to Limit Concurrent Goroutine Execution in Go?

限制并发 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中文网其他相关文章!

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