Go 忽略 GOMAXPROCS

Go ignores GOMAXPROCS

我正在尝试 运行 一个 goroutine(go 版本 go1.4.1 darwin/amd64)同时在主线程中无限循环,但我无法让它工作。如果我理解正确的话,如果我指定了 GOMAXPROCS,go 应该为其他线程安排一个 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 {}
}

问题是当你进入for{}时,新的goroutine还没有被创建(所以它不能被调度)。调度器只能在 goroutine 被阻塞或调用另一个函数时工作,因此在闭环中调度器无法调度。

for{} 前加一个 time.Sleep(time.Millisecond) 就可以了。

但是,我不知道你这样做是否只是为了好玩,但是如果你想在 goroutines 工作时永远等待(或者直到其他 goroutines 死锁或死亡),那就更好了使用 select{} 将阻塞而不会浪费 CPU 个周期。