去忽略GOMAXPROCS

时间:2015-02-23 13:28:41

标签: multithreading go goroutine

我正在尝试与主线程中的无限循环同时运行goroutine(go版本go1.4.1 darwin / amd64),我无法使其工作。如果我理解正确,如果我指定GOMAXPROCS但是它不会安排goroutine到其他线程。即使我在main中明确地写LockOSThread(),我仍然看不到输出。如何在单独的os线程中运行goroutine?

package main

import(
    "fmt"
    "time"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU() * 8)

    go func() {
        for {
            time.Sleep(1 * time.Second)
            fmt.Println("From routine")
        }
    }()

    for {}
}

1 个答案:

答案 0 :(得分:3)

问题是,当您输入for{}时,尚未创建新的goroutine(因此无法进行排除)。调度程序只能工作,然后goroutine被阻止或调用另一个函数,因此在闭环中调度程序无法调度。

for{}之前添加一个time.Sleep(time.Millisecond),它会起作用。

然而,我不知道你这样做是为了好玩,但是如果你想要等待永远(或者直到其他gorounties死锁或死亡),而goroutines工作,那么使用起来要好得多select{}将阻止而不会浪费CPU周期。