为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
人到中年有点甜 2021-11-22 10:45:12
我已经设置了 runtime.GOMAXPROCS(2),但是这个程序在输出一些数字时仍然挂起。我可以看到这个程序使用了高 CPU(超过 100%),但我不明白为什么 for 循环 goroutine 会使我的程序无法运行。linux/amd64 上的 go 版本是 1.4.2,我的电脑有 4 个 CPU。这是代码:package mainimport "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)    }   } 
查看完整描述

3 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

没有必要有一个忙循环,除了消耗 CPU 时间之外什么都不做。它不仅消耗了整个 OS 线程,而且 goroutines 是协作调度的,它会干扰运行时的 goroutines。例如,在 Go1.5 上,这通常会阻止 GC 的 stop-the-world 阶段(您可以通过设置来测试GOGC=off)。


为了让这个程序运行,你可以在 for 循环中插入一个调度点,但最好将它完全删除。


func forever() {

    for {

        runtime.Gosched()

    }

}


查看完整回答
反对 回复 2021-11-22
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

从代码来看,您似乎想在 go 例程中的 for 循环中打印数字。在这种情况下,为什么不使用 channel 来指示 goroutine 何时通过 for 循环完成并相应地退出 main 函数。像这样的东西


package main


import "fmt"

import "runtime"

import "time"



func show(result chan bool) {

    for number := 1; number < 999999; number++ {

        time.Sleep(1000)

        fmt.Println(number)

    }   

    result <- true

}


func main() {

    runtime.GOMAXPROCS(2)

    result := make(chan bool) 

    go show(result)

    <- result


查看完整回答
反对 回复 2021-11-22
?
哔哔one

TA贡献1854条经验 获得超8个赞

很好用runtime.Gosched()。但是在 golang 中,time.Duration 以纳秒为单位,所以 time.Sleep(1000) 几乎没有睡眠。大多数情况下,您将其视为 Java 中的毫秒。你可以试试

time.Sleep( 1000 * time.MilliSecond )


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信