Asynchronous 为什么我相同的围棋程序出了问题?
我有下面的go代码执行例程Asynchronous 为什么我相同的围棋程序出了问题?,asynchronous,go,goroutine,Asynchronous,Go,Goroutine,我有下面的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() {
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)
}
但是,我得到的是:
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完成),您可以进行一些控制,但是您无法控制goroutine的执行顺序,因为其他人已经评论过,goroutine主要是为了并发。并发可以包含并行性和通信。如果你想控制他们的秩序,你必须让他们通过信号沟通。例如,一个goroutine等待来自另一个goroutine的信号。请特别检查goroutine和channel
- 例如:
- 套餐:
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...