在Go中,是否调用time.Sleep()会产生其他goroutines?我有一种感觉,但在其他答案中(例如:了解goroutines)time.Sleep未明确列为调度点.
是.请参阅调度程序中的抢占.
在以前的版本中,永远循环的goroutine可能会在同一个线程上饿死其他goroutine,这是GOMAXPROCS只提供一个用户线程时的一个严重问题.在Go 1.2中,部分解决了这个问题:在进入函数时偶尔会调用调度程序.这意味着任何包含(非内联)函数调用的循环都可以被抢占,允许其他goroutine在同一个线程上运行.
以下设计文档也是很好的读取,以了解有关调度程序的更多信息:
可扩展的Go Scheduler设计文档
Go Preemptive Scheduler Design Doc