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

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

    }   


人到中年有点甜
浏览 213回答 3
3回答

慕神8447489

没有必要有一个忙循环,除了消耗 CPU 时间之外什么都不做。它不仅消耗了整个 OS 线程,而且 goroutines 是协作调度的,它会干扰运行时的 goroutines。例如,在 Go1.5 上,这通常会阻止 GC 的 stop-the-world 阶段(您可以通过设置来测试GOGC=off)。为了让这个程序运行,你可以在 for 循环中插入一个调度点,但最好将它完全删除。func forever() {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; runtime.Gosched()&nbsp; &nbsp; }}

慕尼黑8549860

从代码来看,您似乎想在 go 例程中的 for 循环中打印数字。在这种情况下,为什么不使用 channel 来指示 goroutine 何时通过 for 循环完成并相应地退出 main 函数。像这样的东西package mainimport "fmt"import "runtime"import "time"func show(result chan bool) {&nbsp; &nbsp; for number := 1; number < 999999; number++ {&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(1000)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(number)&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; result <- true}func main() {&nbsp; &nbsp; runtime.GOMAXPROCS(2)&nbsp; &nbsp; result := make(chan bool)&nbsp;&nbsp; &nbsp; go show(result)&nbsp; &nbsp; <- result}&nbsp;

哔哔one

很好用runtime.Gosched()。但是在 golang 中,time.Duration 以纳秒为单位,所以 time.Sleep(1000) 几乎没有睡眠。大多数情况下,您将其视为 Java 中的毫秒。你可以试试time.Sleep(&nbsp;1000&nbsp;*&nbsp;time.MilliSecond&nbsp;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go