以下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程序始终不运行非主线程?
这背后有原因吗?
答案 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)