2015-06-19 110 views
1

我運行下面的Go代碼10倍:goroutine的執行時間點是多少?

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    go fmt.Println("Hello") 
    fmt.Println("World") 
    time.Sleep(1 * time.Millisecond) 
} 

輸出始終是 「World」 第一:

World 
Hello 

是否體現goroutine將執行unitl存在main程序塊?什麼是goroutine的執行時間點?

+0

也許有一個開銷很大的goroutine可以放在第二位。在'fmt.Println'打印'Hello \ nWorld \ n'之前1ms睡眠。 –

+5

@Tichodroma:假設GOMAXPROCS = 1,'time.Sleep'只是將上下文切換到另一個例程。這是計劃人員樂於這樣做的這些_point_中的一個。 (請參閱:http://stackoverflow.com/questions/15771232) – tomasz

回答

4

goroutine的執行時間點是多少?

編譯器會將屈服點插入您的程序的不同位置,看起來足夠。例如,在一些函數調用和看起來很緊的循環中。另外,goroutine會在系統調用時阻塞。因此,當第一個goroutine達到fmt.Println("World")並進入寫入系統調用時,您的程序將可能產生執行到第二個goroutine。在那之後,非確定性會隨之而來,因爲我們不知道這個系統調用需要多長時間。

然而,這是一個實現細節,你不應該關心它。在討論並行性時,唯一的時間保證(即「在...之前發生」)是由像來自標準庫的sync/atomic包那樣的併發基元提供的。

TL; DR:不要依賴屈服點來讓程序正常工作。

+1

特別是**不要依賴屈服點來讓程序正常工作**。如果你這樣做,它現在可能會工作,但是*不能保證*它將來仍然能夠工作,或者在具有更快CPU的不同機器上,或者在不同OS上,或者在具有更多I/O負載的系統上,等等 –