我已经设置了runtime.GOMAXPROCS(2),但是当输出一些数字时,该程序仍然挂起。我可以看到该程序使用了较高的cpu(超过100%),但我不明白为什么for循环goroutine会使我的程序无法正常工作。
在Linux / amd64上,go版本是1.4.2,我的电脑有4个CPU。
这是代码:
package main import "fmt" import "runtime" import "time" func forever() { for { } } func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) fmt.Println(number) } } func main() { runtime.GOMAXPROCS(2) go show() go forever() for { time.Sleep(1000) } }
永远不需要忙碌的循环,除了消耗CPU时间之外,该循环什么也不做。它不仅消耗整个OS线程,而且goroutines被协同调度,并且会干扰运行时的goroutines。例如,在Go1.5上,这通常会阻止GC的停止世界阶段(您可以通过设置进行测试GOGC=off)。
GOGC=off
为了使该程序运行,您可以在for循环中插入一个调度点,但是最好将其完全删除。
func forever() { for { runtime.Gosched() } }