我有以下代码执行例程。
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方法?为什么有些计数方法不同步?
答案 0 :(得分:4)
当goroutine执行时不受程序员的控制。如果你通过通道和sync.WaitGroup使用信号,你有一些控制权(比如有一个goroutine等到另一个完成),但是你无法控制goroutines的执行顺序
答案 1 :(得分:0)
正如其他人已经评论过的那样,goroutine主要是为了并发。并发可以包含并行性和通信。如果您想控制他们的订单,您必须通过SIGNAL进行通信。例如,goroutine等待来自另一个的信号。请特别检查goroutine和频道。