2016-05-19 50 views
2

我有以下代碼執行例程。爲什麼我的相同的程序出現故障?

package main 

import (
     "fmt" 
     "time" 
) 

func count(id int) { 
     for i := 0; i < 10; i++ { 
       fmt.Println(id, ":", i) 
       time.Sleep(time.Millisecond * 1000) 
     } 
} 

func main() { 
     for i := 0; i < 10; i++ { 
       go count(i) 
     } 
     time.Sleep(time.Millisecond * 11000) 
} 

我希望可以將輸出爲:

1 : 0 
2 : 0 
3 : 0 
4 : 0 
5 : 0 
6 : 0 
7 : 0 
8 : 0 
9 : 0 
1 : 1 
2 : 1 
3 : 1 
4 : 1 
etc... 

,而是,我得到:

0 : 0 
6 : 0 
7 : 0 
5 : 0 
8 : 0 
9 : 0 
3 : 0 
2 : 0 
4 : 0 
1 : 0 
5 : 1 
6 : 1 
7 : 1 
1 : 1 
8 : 1 
etc... 

他們爲什麼不在原來的順序,外面的for循環執行計數方法?爲什麼有些計數方法不同步?

+11

沒有爲了將夠程。雖然您可以按某種順序調用它們,但不保證按該順序執行。他們正在異步運行,並且手頭有資源的人員將開始工作。 – evanmcdonnal

回答

4

當goroutine執行不在程序員的控制之下時。如果通過通道和sync.WaitGroup使用信號(例如,有一個goroutine等到另一個goroutine完成),但您無法控制goroutines的執行順序,則可以進行一些控制。

相關問題