Go goroutine如何共享CPU资源?

Ton*_*nis 0 go

假设我启动的 goroutine 数量多于 CPU 中的内核数量。他们如何共享CPU资源?他们会跑一段时间,然后睡一会儿吗?它们是否会在受 CPU 限制的情况下运行,然后退出,从而允许 CPU 匮乏的 goroutine 运行?

e.d*_*dan 5

Go 调度程序负责处理 goroutine 之间的 CPU 资源共享。

我相信它目前是一个协作调度程序,这意味着您的代码需要为调度程序提供上下文切换到其他 goroutine 的机会,通过进行系统调用/函数调用,或使用原子、互斥或通道操作等同步原语。

如果你只是在你的 goroutine 中运行紧密循环而不执行上述任何操作,那么其他 goroutine 以及 Go 调度程序和垃圾收集器也会挨饿,所以要小心。

看起来 Go1.12 可能会计划一些抢占式调度技术,请参见此处:

https://github.com/golang/go/issues/24543

关于 Go 调度程序的进一步阅读:

https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part2.html

Goroutine 是协作调度的。这是否意味着不产生执行的 goroutine 会导致 goroutine 一个接一个地运行?