猿问

为什么我相同的围棋程序出现故障?

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


海绵宝宝撒
浏览 143回答 2
2回答

江户川乱折腾

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

阿波罗的战车

正如其他人已经评论的那样,goroutine 主要针对并发性。并发可以包含并行性和通信。如果你想控制他们的顺序,你必须让他们通过SIGNAL进行交流。例如,一个 goroutine 等待来自另一个 goroutine 的信号。请特别检查 goroutine 和 channel。示例:https&nbsp;:&nbsp;//micknelson.wordpress.com/2012/11/14/a-tour-of-go-the-web-crawler-exercise/包:https&nbsp;:&nbsp;//golang.org/pkg/os/signal/
随时随地看视频慕课网APP

相关分类

Go
我要回答