登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-12 08:23:08 186浏览 收藏

本篇文章给大家分享《如何等到缓冲通道(信号量)为空?》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我有一块整数,它们是同时操作的:

ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

我使用缓冲通道作为信号量,以便获得同时运行的 go 例程的上限:

sem := make(chan struct{}, 2)

for _, i := range ints {
  // acquire semaphore
  sem 

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

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

正确答案

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

使用 async.WaitGroup等待所有 goroutine 完成

sem := make(chan struct{}, 2)

var wg sync.WaitGroup

for _, i := range ints {
    wg.Add(1)
    // acquire semaphore
    sem 

终于介绍完啦!小伙伴们,这篇关于《如何等到缓冲通道(信号量)为空?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>