首页 > 后端开发 > Golang > 使用缓冲通道作为信号量时如何确保所有 Goroutines 完成?

使用缓冲通道作为信号量时如何确保所有 Goroutines 完成?

Mary-Kate Olsen
发布: 2024-11-29 06:27:12
原创
368 人浏览过

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

等待空缓冲通道(信号量)

在并发编程中,控制同时执行的 goroutine 数量至关重要。一种方法是使用缓冲通道作为信号量。然而,在等待信号量完全耗尽时会出现一个常见问题。

问题:

假设我们有一个整数切片要同时处理,限制为两个并发去例行公事。我们使用缓冲通道作为信号量来强制执行此限制。虽然代码适用于大多数整数,但由于缓冲区永远不会达到空,程序在最后一个 go 例程完成之前提前退出。

问题:

我们如何等待缓冲通道完全排空,确保所有 go 例程在程序退出之前完成?

答案:

使用通道由于缺乏无竞争的方法来检查其长度,等待特定条件是不可行的。相反,我们可以使用sync.WaitGroup来监控所有goroutines的完成。

已解决的代码:

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完成之前程序退出,确保所有处理完成。

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

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