go语言实战中有段代码不明白,请问哪位帮忙给看一下,多谢

darren_lou · · 2695 次点击
在GMP中,一个G(goroutinue)创建后会优先进入到 P 的本地队列中进行执行。如果这个G又创建了一个G,则这个G会存放在P的 runnext 字段中(P会优先执行runnext中的G)。当runnext中已经有了G时,这个G会被挤到P的本地队列中。 代码运行 : main-G运行 创建 G-a(输出小写字母的goroutinue) 此时唯一一个P的runnext为空,G-a进入runnext。创建 G-A(输出大写字母的goroutinue),此时runnext已有G-a,则会将G-a挤到P的本地队列中。此时的runnext存放的是G-A。代码执行到wg.wait , 主G让出M,执行runnext中的G-A,输出大写字母,执行完毕 runnext为空,执行本地队列中的G-a 输出小写字母。
#12
更多评论
这里应该是单核状态下调度器算法决定的,我一开始以为是defer先进后出的机制造成的结果,后来试了一下for循环输出0-9,得到的结果是9012345678,所以排除defer入栈的可能,目前以我的理解是这样的,你可以试试你单核时候打印0-9是不是和我一样的结果
#1
go内部有一套协程调度机制,类似cpu线程上下文切换,每个线程会给一个固定的时间片来执行,时间片结束之后会暂停这个线程并将上下文切换到下一个线程。这里的意思可能是说这个goroutine在时间片之内就执行完成了,并没有发生上下文切换,而且runtime.GOMAXPROCS(1)是设置最大并行数,所以相当于是单核,不存在多个goroutine并行。 那么问题来了,为什么始终会先打印大写,坐等大佬
#2