【发布时间】:2020-12-25 09:43:59
【问题描述】:
我试图通过运行小程序来学习频道。我不明白下面的程序,因为它给出了一个奇怪的输出:
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 在工作完成后的某个时刻“停止工作”。你给了它一个非常短的任务,你的计算机可以在不到一秒的时间内完成这并不奇怪。
-
runtime.NumGoroutine 报告所有 goroutine,不仅包括您启动的那些,还包括运行时 itslef 使用的那些。这里没有什么可看或学到的。