为什么我相同的 go 例程乱序了?

Why are my identical go routines out of order?

我有以下go代码执行例程。

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循环外执行count方法?为什么有些计数方法不同步?

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

的执行顺序

正如其他人已经评论的那样,goroutine 主要针对并发。并发可以包含并行性和通信。如果你想控制它们的顺序,你必须让它们通过SIGNAL进行通信。例如,一个 goroutine 等待来自另一个 goroutine 的信号。请特别检查 goroutine 和 channel。