Goroutine执行了几秒钟但停止了

时间:2018-06-18 16:34:35

标签: go

我目前正在学习golang,并且我尝试过以下代码:

package main

import (
    "fmt"
)

func main() {
    go routine()
    go routine2()

    fmt.Println("I am not interrupted by Go routine :)")

    for {

    }
}

func routine() {
    for {
        fmt.Println("hello, world!")
    }
}

func routine2() {
    for {
        fmt.Println("hello, world222")
    }
}

当我运行此程序时,我得到输出:"hello, world""hello, world222"几秒钟。然而,几秒钟后,我再也没有得到任何东西,但程序仍在运行。

出了什么问题?为什么程序停止显示hello, worldhello, world222

2 个答案:

答案 0 :(得分:3)

这是因为现在(去1.10)Go的调度程序不是先发制人的,并且没有计划这样做。

这意味着Go的调度程序可能会遇到一些罕见的情况,即有一个无限循环无效的Go的日程安排感觉就像是中断了。这包括一个空的无限循环。

要阻止goroutine进行测试,请使用select{}代替for {}

参考文献:

https://github.com/golang/go/issues/11462

https://github.com/golang/go/issues/10958

答案 1 :(得分:0)

您正在使用空for循环来刻录CPU 使用select代替for

import (
    "fmt"
    "time"
)

func main() {
    go routine()
    go routine2()

    fmt.Println("I am not interrupted by Go routine :)")
    select{}
}

func routine() {
    for {
        fmt.Println("hello, world!")
        time.Sleep(time.Second)
    }
}

func routine2() {
    for {
        fmt.Println("hello, world222")
        time.Sleep(time.Second)
    }
}

您的代码没问题,永远不会停止,但这是正确的。