我正在尝试与主线程中的无限循环同时运行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 {}
}
答案 0 :(得分:3)
问题是,当您输入for{}
时,尚未创建新的goroutine(因此无法进行排除)。调度程序只能工作,然后goroutine被阻止或调用另一个函数,因此在闭环中调度程序无法调度。
在for{}
之前添加一个time.Sleep(time.Millisecond),它会起作用。
然而,我不知道你这样做是为了好玩,但是如果你想要等待永远(或者直到其他gorounties死锁或死亡),而goroutines工作,那么使用起来要好得多select{}
将阻止而不会浪费CPU周期。