2015-02-23 15 views
0

我試圖運行一個goroutine(go版本go1.4.1達爾文/ amd64)與無限循環同時在主線程中,我不能使它的作品。如果我理解正確,如果我指定GOMAXPROCS,它應該安排一個goroutine到其他線程,但它不會。即使我主要寫明LockOSThread()我仍然看不到輸出。如何讓在單獨的os線程中運行goroutine?Go忽略GOMAXPROCS

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

我認爲這裏的問題是,當您輸入{}時,新的goroutine尚未創建(因此無法排除)。調度程序只能工作,然後goroutine被阻塞或調用另一個函數,因此在閉環中調度程序不能調度。在for {}之前添加一個time.Sleep(time.Millisecond),它將起作用。 – siritinga 2015-02-23 13:41:57

+1

@siritinga是的,它有幫助。謝謝。請答覆,以便我可以接受。 – 2015-02-23 13:48:24

回答

3

的問題是,新夠程尚未創建(所以它不能被scheluded),當你進入for{}。調度程序只能工作,然後goroutine被阻塞或調用另一個函數,因此在閉環中調度程序不能調度。

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

但是,我不知道你是否僅僅爲了好玩而這樣做,但是如果你想等到永遠(或者直到其他巨頭死鎖或者死亡),那麼在goroutines工作的時候,要好得多使用select{}將會阻塞而不會浪費CPU週期。

+2

比'time.Sleep'更好['runtime.Gosched'](https://golang.org/pkg/runtime/#Gosched)。 – 2015-02-23 14:52:42

+0

我試過,戴夫,但似乎在約10%的情況下,調度程序將在goroutine創建之前再次運行main(在Go1.4.2和Raspberry Pi上測試)。當然,最好的解決方案是使用頻道或WaitGroup來發信號通知主新程序。 – siritinga 2015-02-23 14:57:36