登录
首页 >  Golang >  Go问答

活动 goroutine 数量的奇怪输出

来源:stackoverflow

时间:2024-04-06 15:30:36 175浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《活动 goroutine 数量的奇怪输出》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我尝试通过运行小程序来学习频道。我不明白下面的程序,因为它给出了一个奇怪的输出:

func squares(c chan int) {
    for i := 0; i < 4; i++ {
        num := <-c
        fmt.Println(num * num)
    }
}

func main() {
    c := make(chan int, 3)
    go squares(c)

    c <- 1
    c <- 2
    c <- 3
    c <- 4

    fmt.Println(runtime.NumGoroutine())
    time.Sleep(time.Second)
    fmt.Println(runtime.NumGoroutine())
}

在执行这个程序时,我看到它首先打印出活动 goroutine 的数量为 2。然后一秒钟后,它给出了 1。这真的很奇怪。

我查了一些博客,但无法理解。那么,在 goroutine 停止工作的那一瞬间到底发生了什么变化呢?


解决方案


无法保证 goroutine 的顺序。根据您的观察,看起来在写入通道后,主 goroutine 继续并将活动 goroutine 打印为两个,然后 squares goroutine 运行并完成。

有可能你也从第一次调用获取 goroutine 数量时得到 1。如果 squares goroutine 在主 goroutine 写入通道后立即运行,就会发生这种情况。您可以通过在写入通道后但在获取 goroutine 数量之前添加睡眠调用来强制执行此操作。

今天关于《活动 goroutine 数量的奇怪输出》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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