我有以下执行例程的 go 代码。package mainimport ( "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 : 02 : 03 : 04 : 05 : 06 : 07 : 08 : 09 : 01 : 12 : 13 : 14 : 1etc...但相反,我得到:0 : 06 : 07 : 05 : 08 : 09 : 03 : 02 : 04 : 01 : 05 : 16 : 17 : 11 : 18 : 1etc...为什么它们不是按照原始的顺序,在外部 for 循环执行 count 方法?为什么某些计数方法不同步?
2 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
goroutine 何时执行是程序员无法控制的。如果您通过通道和 sync.WaitGroup 使用信号,您可以进行一些控制(例如让一个 goroutine 等待另一个 goroutine 完成),但您无法控制 goroutines 的执行顺序
阿波罗的战车
TA贡献1862条经验 获得超6个赞
正如其他人已经评论的那样,goroutine 主要针对并发性。并发可以包含并行性和通信。如果你想控制他们的顺序,你必须让他们通过SIGNAL进行交流。例如,一个 goroutine 等待来自另一个 goroutine 的信号。请特别检查 goroutine 和 channel。
- 2 回答
- 0 关注
- 142 浏览
添加回答
举报
0/150
提交
取消