小编典典

GOMAXPROCS已经是2,但是程序仍然挂起

go

我已经设置了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)
    }   
}

阅读 288

收藏
2020-07-02

共1个答案

小编典典

永远不需要忙碌的循环,除了消耗CPU时间之外,该循环什么也不做。它不仅消耗整个OS线程,而且goroutines被协同调度,并且会干扰运行时的goroutines。例如,在Go1.5上,这通常会阻止GC的停止世界阶段(您可以通过设置进行测试GOGC=off)。

为了使该程序运行,您可以在for循环中插入一个调度点,但是最好将其完全删除。

func forever() {
    for {
        runtime.Gosched()
    }
}
2020-07-02