奇怪的 Goroutines 行为

如果我错了,请纠正我。据我所知,goroutine 的工作原理与线程大致相似。所以如果我用不同的参数生成相同的函数,前缀为 go。它应该可以正常工作吗?


package main


import "fmt"



func f(from string) {

    for i := 0; i < 3; i++ {

        fmt.Println(from, ":", i)

    }

}


func main() {

    go f("direct")

    go f("redirect")

    //var input string

    //fmt.Scanln(&input)


}

实际输出:


rahul@g3ck0:~/programs/go$ go run goroutine.go 

rahul@g3ck0:~/programs/go$ 

我刚回来提示。


预期输出:


direct : 0

direct : 1

direct : 2

redirect : 0

redirect : 1

redirect : 2

不一定按相同的顺序。

无法理解这种奇怪的行为。我错过了什么吗?


编辑:添加 Scan 语句可以解决它。但是有没有更好的方法呢?


喵喔喔
浏览 191回答 2
2回答

慕斯709654

如上所述,最后的 select{} 确保显示输出,但您不能期望 go 例程以特殊顺序运行。如果您运行并行 go 例程,则永远无法保证它们将按什么顺序运行。你不能不让它们按顺序运行,因为它们是并行运行的!您可能会在一台机器上一次又一次地获得预期的输出,但不能保证每次在任何给定机器上都能按顺序打印输出!!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go