当前位置: 首页 > 面试题库 >

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

宋飞文
2023-03-14
问题内容

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

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

func forever() {
    for {
        runtime.Gosched()
    }
}


 类似资料:
  • 我正在EclipseIDE中用Yii2开发一个项目。我无意中删除了vendor/yiisoft下的Yii2文件夹。但我的应用程序仍然像charme一样工作,它不会抛出任何异常。我使用Composer安装http://www.yiiframework.com/extension/yii2-improved-basic-template/.文件供应商/composer/autoload_psr4。ph

  • 问题内容: 据我所知,使用旧的JMM来实现懒惰单调的DCL(双重检查锁定)技巧被打破了,但是我坚信它已被新的JMM和volatile字段所修复… 但是,在这篇不错的文章中,这显然已经足够新,足以引用DCL中的新旧JMM和volatile字段,表明它仍然坏了… 我在这里到那里读到它是固定的,然后我发现了这一点……有人可以最后说它是否损坏了? 我的理解是,通过波动性地在关系发生之前保证发生的先兆并有效

  • java版本“1.6.0_37”java(TM)SE运行时环境(build 1.6.0_37-B06-434-11M3909)java HotSpot(TM)64位服务器VM(build 20.12-B01-434,混合模式) 如果在尝试安装java应用程序(LatexDraw)时总是出现错误,那么terminal上的版本6就不会有问题: :CGContextGetCTM:无效上下文0x0 :CG

  • 我有一个带有以下启动代码的Spring Boot应用程序。执行器endpoint被映射,并且bean被移除。我看到执行器endpoint注册,然后豆移除。通过SO线程,消息是无害的。但是当我试图到达任何执行器的终点时,我会得到错误。我不确定我应该进一步研究什么来使执行器工作。我正在附上我提到的所有日志片段。 我用Maven设置了项目: MavenSpring执行器部分 最终我在日志中看到bean被

  • 问题内容: 当未设置相同名称的环境变量时,是否可以确保将GOMAXPROCS设置为1? 此代码显示值: 并像这样运行它: 显示在这种情况下为1,但我在这里寻找一些确认。 问题答案: UPDATE 2018: 默认情况下,Go程序在将GOMAXPROCS设置为可用内核数的情况下运行;在以前的版本中,它默认为1。 从Go 1.5开始,默认值为核心数。如果您在较新的Go版本中对此不满意,则只需要显式设置