首页 > 后端开发 > Golang > 使用缓冲通道作为信号量时,如何确保所有 Goroutine 在程序退出之前完成?

使用缓冲通道作为信号量时,如何确保所有 Goroutine 在程序退出之前完成?

Linda Hamilton
发布: 2024-12-30 10:09:11
原创
498 人浏览过

How to Ensure All Goroutines Complete Before Program Exit When Using a Buffered Channel as a Semaphore?

等待缓冲通道耗尽

在提供的代码中,缓冲通道用作信号量来限制并发数量运行 goroutine。然而,如果没有明确的机制来等待通道耗尽,主程序可能会在所有 goroutine 执行完毕之前终止。

问题:

如何确保程序会等待所有 goroutine 完成之前退出?

答案:

为此目的使用信号量(通道)并不理想,因为没有内置方法来检查通道的长度并等待它达到 0。要正确等待 goroutine 完成,请考虑使用同步原语,例如sync.WaitGroup.

更新的代码:

sem := make(chan struct{}, 2)
var wg sync.WaitGroup

for _, i := range ints {
    wg.Add(1)
    // acquire semaphore
    sem <- struct{}{}
    // start long running go routine
    go func(id int) {
        defer wg.Done()
        // do something
        // release semaphore
        <-sem
    }(i)
}

wg.Wait()
登录后复制

sync.WaitGroup 维护未完成任务的计数(在本例中为 goroutine) 。这允许主程序等待所有任务完成。 wg.Add(1) 在启动新的 goroutine 之前增加任务计数,而 wg.Done() 在 goroutine 完成时减少计数。 wg.Wait() 调用会阻塞主程序,直到任务计数达到 0,确保所有 goroutine 在程序退出之前都已完成。

以上是使用缓冲通道作为信号量时,如何确保所有 Goroutine 在程序退出之前完成?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板