【发布时间】:2018-02-12 16:12:11
【问题描述】:
我正在学习 golang。我有一个 goroutine 来打印变量i,然后我写了一个死循环。但是当 var i 到 491519(or some other value) 时,终端上没有输出。看起来 print var i 的 goroutine 不再被调度,CPU 在输出 491519 后一直执行死循环。谁能告诉我原因?
谢谢。
我的代码:
package main
import (
"fmt"
"runtime"
)
func main() {
go func() {
i := 1
for {
fmt.Println(i)
i = i + 1
}
}()
runtime.GOMAXPROCS(4)
for {
}
}
我想补充一点:
当我在最后一个死循环中添加fmt.Println("ABC") 时,ABC 或i 的交替输出将永远在终端上。
我的 go 版本:go version go1.9.1 darwin/amd64
【问题讨论】:
-
您的循环很忙。没有理由在您的代码中有一个繁忙的循环。
-
@JimB 谢谢你回答我。我已经设置了可以同时执行的最大 CPU 数,busy loop 和其他 goroutine 理论上应该同时执行。但是goroutine在运行一段时间后没有被调度。
-
goroutines 需要被运行时中断。没有抢占点的繁忙循环不能被抢占,因此最终会阻塞进程。这在实践中并不是一个真正的问题,因为空忙是一个编程错误,没有理由在您的代码中包含一个。