我是 Go 的新手。几小时后在谷歌上仍然找不到这个问题的解释。 下面的代码在 Windows 上运行正常。 它运行:
0
2
3
2A
它会一直等待,但相同的代码在 Linux (Ubuntu) 上无法运行,goroutine 从未执行过:
0
2
3
它会永远等待。
package main
import ("fmt")
var exit bool=false
func main(){
fmt.Println("0")
fmt.Println("2")
go func() {
fmt.Println("2A");
}()
fmt.Println("3")
for {
if exit {
break
}
}
fmt.Println("4")
}
环境:Linux Ubuntu,go1.10.3 linux/amd64
最佳答案
尝试在 Go Playground 上运行相同的程序。它将显示由于永无止境的 for 循环,该过程花费了很长时间。
for { // It is never ending for loop which never exit.
if exit {
break
}
}
但是你不能依赖于 go routines 的顺序。这是随机的。您还需要注意的一件事是,如果您删除 for 循环,则 main 将在您的 go 例程返回结果之前退出。
package main
import (
"fmt"
)
var exit bool = false
func main() {
fmt.Println("0")
fmt.Println("2")
go func() {
fmt.Println("2A")
}()
fmt.Println("3")
fmt.Println("4")
}
输出
0
2
3
4
在 Playground 上查看
作为一个建议,在您希望在主退出之前等待 go 例程完成的情况下,最好使用 WaitGroup 。举个例子。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var exit bool = false
func main() {
fmt.Println("0")
fmt.Println("2")
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("2A")
}()
fmt.Println("3")
fmt.Println("4")
wg.Wait()
}
输出
0
2
3
4
2A
关于 Go playground 的工作代码
关于Goroutine 从未在 Linux 上执行但在 Windows 上正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52019213/