为什么我的相同的常规程序无序?

时间:2016-05-19 20:26:52

标签: asynchronous go goroutine

我有以下代码执行例程。

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...

为什么它们不是原来的顺序,外循环执行count方法?为什么有些计数方法不同步?

2 个答案:

答案 0 :(得分:4)

当goroutine执行时不受程序员的控制。如果你通过通道和sync.WaitGroup使用信号,你有一些控制权(比如有一个goroutine等到另一个完成),但是你无法控制goroutines的执行顺序

答案 1 :(得分:0)

正如其他人已经评论过的那样,goroutine主要是为了并发。并发可以包含并行性和通信。如果您想控制他们的订单,您必须通过SIGNAL进行通信。例如,goroutine等待来自另一个的信号。请特别检查goroutine和频道。