fmt.go例程中的打印*主线程循环时可能不会输出

时间:2019-02-15 05:07:38

标签: go goroutine

以下https://play.golang.org/p/X1-jZ2JcbOQ中的代码

package main
import (
        "fmt"
)
func p(s string) {
        fmt.Println(s)
}

func main() {
    go fmt.Println("1")
    go p("2")
    for {}   // infinite loop
}

在带有golang 1.11的Windows中肯定会打印1 2,但在带有golang 1.11.4的Linux中肯定不会打印任何内容。我可以理解前者的行为,但不能理解后者。为什么go程序始终不运行非主线程?

这背后有原因吗?

1 个答案:

答案 0 :(得分:3)

Go Playground的运行方式为GOMAXPROCS = 1。在操场上尝试一下:

package main

import (
  "fmt"
  "runtime"
)

func main() {
  fmt.Println(runtime.GOMAXPROCS(0))
}

在本地运行时,GOMAXPROCS的价值可能更高。

即使在操场上,通过引入Sleep [{https://play.golang.org/p/QquMPZSd6kI]}

,按如下所示安排主goroutine的时间,也可以看到打印工作:
func main() {
    go fmt.Println("1")
    go p("2")

    time.Sleep(time.Second)
    for {}
 }

OR

在开始时更改GOMAXPROCS:

    runtime.GOMAXPROCS(2)