首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何等到缓冲通道(信号量)为空?

如何等到缓冲通道(信号量)为空?
EN

Stack Overflow用户
提问于 2016-09-29 17:25:06
回答 5查看 17.8K关注 0票数 17

我有一段整数,这些整数是并发操作的:

代码语言:javascript
运行
复制
ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

为了具有并发运行go例程的上限,我使用缓冲通道作为信号量:

代码语言:javascript
运行
复制
sem := make(chan struct{}, 2)

for _, i := range ints {
  // acquire semaphore
  sem <- struct{}{}

  // start long running go routine
  go func(id int, sem chan struct{}) {
    // do something

    // release semaphore
    <- sem
  }(i, sem)
}

上面的代码在到达最后一个或最后两个整数之前运行得很好,因为程序在完成最后一个go例程之前就结束了。

问题:如何等待缓冲通道耗尽?

EN

Stack Overflow用户

回答已采纳

发布于 2016-09-29 17:29:48

您不能以这种方式使用信号量(在本例中为通道)。在处理值和分配更多的goroutines时,不能保证它不会是空的。在这种情况下,这不是一个特别的问题,因为您是在同步地分配工作,但是因为没有无竞争的方法来检查通道的长度,所以没有基本的方法来等待一个通道的长度达到0。

使用sync.WaitGroup等待所有峡谷的完成

代码语言:javascript
运行
复制
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()
票数 24
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39776481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档