gpt4 book ai didi

go - 带有事件goroutine数量的奇怪输出

转载 作者:行者123 更新时间:2023-12-01 21:16:07 25 4
gpt4 key购买 nike

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

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())
}
在执行该程序时,我看到它首先将 Activity 的goroutine的数量打印为2。然后在第二秒钟将其输出为1。这确实很奇怪。
我查了几个博客,但听不懂。那么,goroutine停止工作的瞬间实际上发生了什么变化?

最佳答案

无法保证goroutine的顺序。根据您的观察,看起来像在写入 channel 之后,主goroutine继续运行并将 Activity goroutine打印为两个,然后squares goroutine运行并完成。
您也有可能从第一个调用中获得1来获取goroutine的数量。如果squares goroutine在主goroutine写入 channel 后立即运行,则会发生这种情况。您可以通过在写入 channel 之后但在获取goroutine数量之前添加一个sleep调用来强制执行此操作。

关于go - 带有事件goroutine数量的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com