假设我启动的 goroutine 数量多于 CPU 中的内核数量。他们如何共享CPU资源?他们会跑一段时间,然后睡一会儿吗?它们是否会在受 CPU 限制的情况下运行,然后退出,从而允许 CPU 匮乏的 goroutine 运行?
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 一个接一个地运行?
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |