2016-05-19 29 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的执行顺序,则可以进行一些控制。

相关问题