请参阅下面的这些代码。 我不会在任何制作中这样做,只是为了学习目的。
我从许多发帖者那里听说忙循环通常会阻止调度,因为它们没有给 go sheduler 到 scheduler 留下任何机会。如果这是真的,为什么 deadloop() goroutine 可以被调度??
我正在使用 golang 1.12
并在 Windows 操作系统上进行测试。
func main() {
go deadloop() // v1 -- keeps printing forever
var i =1
for {
i++
}
}
func deadloop() {
i := 0
for {
fmt.Printf("from deadloop\n")
i++
}
}
更新: 我很困惑,所以我没有把问题说得更清楚。今天改了内容,还是有同样的疑问。
最佳答案
根据@Cerise 的回答,这是因为忙循环,for
循环在您的 main
函数中。如果循环的目的是防止 main
退出,那么不要使用 for
,而是使用 select
。见下面的代码:
func main() {
go deadloop2()
select { } // <----- here
}
func deadloop2() {
i := 0
for {
fmt.Printf("from deadloop i=%d\n", i)
i++
}
}
关于go - 为什么 Goroutine 在 Busy Loop 之后还能被调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193098/