为什么我相同的 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。
我有以下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。