go的协程调度
go的协程调度为 [典藏版] Golang 调度器 GMP 原理与调度全分析
简单说明:
G:协程
M:运行的线程
P:执行线程的处理器,可以理解为cpu中的线程/进程
- 在运行时,...,则变成了100%输出 testNum=1:
刚刚我们看到了GMP的第一点,有多少个P,就应该有多少个M/G同时运行,那么问题来了,为什么上面的2个协程没有并行呢?...GMP的另一个特点:
- P可能会有多个M绑定,当M阻塞后,P将绑定其他M进行执行
- M会有多个G绑定,当一个G阻塞后,将获取一个新的G进行运行
- 如果M的G已经超出数量后,将会分一半给其他的M
-...如果M没有可以执行的G后,将会偷其他M的G
在示例代码,由于是先执行的go func,sleep(协程2),所以M在执行main开始之后,立即开始执行协程2,同时由于协程2 sleep阻塞,所以切回main...协程运行,在刚执行的时候,由于并没有繁忙情况,所以没有启用M2和P2进行运行,所以没有实现并行
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn