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 个周期。
我正在尝试 运行 一个 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 个周期。