Goroutine 从未在 Linux 上执行但在 Windows 上正常工作

标签 go goroutine

我是 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
     }
}

Playground example

但是你不能依赖于 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/

相关文章:

sockets - 在 goroutines 中使用套接字的正确方法是什么

go - 在没有锁的情况下并发读取函数指针是否安全?

svg - 如何/在何处执行生成 svg 的 golang 二进制文件

go - 关于goroutine无限循环和内存分配的问题

go - 给一个变量赋值 "label"类型,或者如何在指针之间进行类型转换

http - 无法通过 Go API 在客户端中设置 cookie

go - 为什么在Golang中发送的值大于缓冲 channel 大小会导致死锁错误?

parallel-processing - 去函数 channel 中的死锁

string - 如何在 Go 中将 uint16 转换为 2 字节字符串?

HTTP 响应始终为空