goroutine实例与分析
/ / 点击实例1:多个goroutine在单个P上运行时调度队列分析
示例代码:
1 | package main |
此处打印结果应该是不定的,大多数是 9012345678。
原因:在创建协程时,当前协程会先把它放到本地P的runnext中去,该字段用于存放新创建的G,以求更早地运行它,如果此时runnext字段已有一个G,那么这个已有的G就会被踢到P的可运行G队列末尾。此处协程里逻辑比较简单,运行速度很快,所以大多数情况都会按 9 0-8这样顺序调度,如果协程里逻辑比较复杂、CPU执行效率低下或调度器执行了调度了其他任务,结果就可能与这里有出入。
更改num的值,在num值改为小于等于257,都按上述流程工作,因为P本地G队列长度为256,再加上runnext,P本地就可以持有257个G,当大于257个G创建时,它们会被放到全局G队列中去(如果p.runq满,其中一半的G会被转移到调度器的可运行G队列中)
全文完。