登录
首页 >  Golang >  Go问答

如何保持 goroutine 数量的最大值恒定

来源:stackoverflow

时间:2024-03-13 08:21:30 347浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何保持 goroutine 数量的最大值恒定》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

for i := 1; i <= 5; i++ {
    wg.Add(1)
    go func() {
           go messenger(i)
           go messenger(i-1)
    }()
    wg.Done()
}
wg.Wait()

我很困惑,这个 for 循环不会创建 5 个全部同步的 go 例程吗?由于某种原因,当我打印出 runtime.numgoroutine() 时,它在 6 和 7 之间变化,有时也会丢失数据。


解决方案


wg.wait() 函数应该等待所有正在运行的 go 例程,但是在启动匿名 go func 之后,

go func() {
    go messenger(i)
    go messenger(i-1)
}()

, wg.done() 也会被执行,这会减少等待组计数器。循环结束后,该计数器变为 0,并且 wg.done() 不会等待任何操作。

因此,如果您希望等待组等待 wg.wait() 来完成 go 例程,那么您应该将 wg.done() 移到 go func 内,例如,

go func() {
    defer wg.Done()
    go messenger(i)
    go messenger(i-1)
}()

还有一点messenger函数被作为go例程调用。这样,匿名 go 函数将不会等待它们完成,因为它只会创建两个 go 例程并退出。这是想要的功能吗?并且,由于这个 runtime.numgoroutine() 大于 5

以上就是《如何保持 goroutine 数量的最大值恒定》的详细内容,更多关于的资料请关注golang学习网公众号!

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