我目前正在学习golang,并且我尝试过以下代码:
package main
import (
"fmt"
)
func main() {
go routine()
go routine2()
fmt.Println("I am not interrupted by Go routine :)")
for {
}
}
func routine() {
for {
fmt.Println("hello, world!")
}
}
func routine2() {
for {
fmt.Println("hello, world222")
}
}
当我运行此程序时,我得到输出:"hello, world"
和"hello, world222"
几秒钟。然而,几秒钟后,我再也没有得到任何东西,但程序仍在运行。
出了什么问题?为什么程序停止显示hello, world
和hello, world222
?
答案 0 :(得分:3)
这是因为现在(去1.10)Go的调度程序不是先发制人的,并且没有计划这样做。
这意味着Go的调度程序可能会遇到一些罕见的情况,即有一个无限循环无效的Go的日程安排感觉就像是中断了。这包括一个空的无限循环。
要阻止goroutine进行测试,请使用select{}
代替for {}
。
参考文献:
答案 1 :(得分:0)
您正在使用空for
循环来刻录CPU
使用select
代替for
import (
"fmt"
"time"
)
func main() {
go routine()
go routine2()
fmt.Println("I am not interrupted by Go routine :)")
select{}
}
func routine() {
for {
fmt.Println("hello, world!")
time.Sleep(time.Second)
}
}
func routine2() {
for {
fmt.Println("hello, world222")
time.Sleep(time.Second)
}
}
您的代码没问题,永远不会停止,但这是正确的。