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

时间:2015-11-04 14:31:45

标签: go

我已经设置了runtime.GOMAXPROCS(2),但是当输出一些数字时,这个程序仍然挂起。我可以看到这个程序使用的高CPU(超过100%),但我不明白为什么for循环goroutine可以使我的程序不起作用。

linux / amd64上的版本是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)
    }   
} 

3 个答案:

答案 0 :(得分:2)

除了刻录CPU时间之外,没有必要进行繁忙的循环。它不仅消耗整个OS线程,而且goroutine是合作安排的,它会干扰运行时的goroutines。例如,在Go1.5上,这通常会阻止GC的停止世界阶段(您可以通过设置GOGC=off来测试)。

要运行此程序,您可以在for循环中插入一个计划点,但最好将其删除。

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

答案 1 :(得分:0)

从代码中,看起来你想在go例程中打印for循环中的数字。在这种情况下,为什么不使用通道来指示何时使用for循环完成go例程并相应地退出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
} 

答案 2 :(得分:-1)

最好使用works: boolean; func(e){ if(e.target.checked){ this.works = true; } else{ this.works = false; } console.log(this.works); } 。 但是在golang中,time.Duration以纳秒为单位,因此time.Sleep(1000)几乎没有睡眠。大多数情况下,您认为它像Java中的毫秒级一样。您可以尝试

runtime.Gosched()