jos*_*hlf 13
os.Exit
可能发生的是for循环不断向可用goroutine列表中添加新的goroutine,但由于整个进程只在一个OS线程中运行,因此Go调度程序从未实际调度过不同的goroutine,并且只是继续运行for循环没有运行你产生的任何goroutine.试试这个:
package main
import "os"
func main() {
for {
go func() { os.Exit(0) }()
func() {}()
}
}
如果你在Go Playground上运行它,它应该工作(事实上,这是一个链接).
好吧,上面的代码在你的代码不起作用的事实应该是非常神秘的.这样做的原因是Go调度程序实际上是非抢占式的.这意味着除非给定的goroutine自愿决定给调度程序选择运行其他东西,否则没有别的东西可以运行.
func() {}()os.Exit
runtime.Gosched()
- 或者您可以将GOMAXPROCS更改为> 1,它将无需修改即可使用.当你发现GOMAXPROCS在操场上是1时非常明显. (2认同)
- @AL,去吧很简单.当你使用goroutines和channel编写适当的惯用代码时,一切都会正常工作.但是表面上的简单内容很复杂.Golang简单性是关于运行时的复杂性以及它对您的影响.因此,当你找到像这样的边缘情况时,你必须深入挖掘以了解正在发生的事情.当你有一个没有函数调用且你的GOMAXPROCS = 1的无限循环时,死锁和goroutines饥饿是一个边缘情况.这是一个众所周知的,但如果不了解go调度程序的基础知识,就很难理解. (2认同)