【问题标题】:Why are my identical go routines out of order?为什么我相同的围棋程序出现故障?
【发布时间】:2016-09-16 22:23:45
【问题描述】:

我有以下执行例程的 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 方法?为什么有些计数方法不同步?

【问题讨论】:

  • goroutines 没有顺序。虽然您可以按某种顺序调用它们,但不能保证它们按该顺序执行。它们以异步方式运行,手头有资源的人将开始工作。

标签: asynchronous go goroutine


【解决方案1】:

goroutine 何时执行是程序员无法控制的。如果您通过通道和 sync.WaitGroup 使用信号,您可以进行一些控制(例如让一个 goroutine 等待另一个 goroutine 完成),但您无法控制 goroutines 的执行顺序

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多