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