关于GoRoutine的一个运行问题

这是谢大神书里的一个例子,我改成了下面这样:

package main

import (
    "fmt"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        fmt.Println(s)
    }
}

func main() {
    go say("world") //开一个新的Goroutines执行
    for {
    }
}

主线程在开辟了一个新线程之后就进入死循环,但是子线程里的Println貌似没有输出。这是为什么?

阅读 9.8k
3 个回答

因为目前的GO版本中,默认只使用单个CPU工作,虽然开启了gorutine,但死循环把资源占用了,rutine分配不到cpu去执行。

要想输出结果,有两种办法,1,在main中让出cpu,2,开启多核心支持。

代码示例:

package main

import (
    "fmt"
    "runtime"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        fmt.Println(s)
    }
}

func main() {
    go say("world") //开一个新的Goroutines执行
    //runtime.Gosched()     //方案1,出让CPU时间
    runtime.GOMAXPROCS(2)   //方案2,设置使用2核心CPU
    for {
    }
}

希望对你有所帮助。

Go1.6版本
当前GOMAXPROCS会被设置为可用的核数,之前默认为1

你可以把 for {} 换成 select {} 试试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏