Goroutine启动与初始化的顺序
来源:1-4 Go 程序是怎么跑起来的
拧壶冲
2021-05-16 11:15:08
昨天曹大布置了一个代码问题,要求自行下去运行观察结果
使用 channel的版本会死锁。因为channel必须有一对接/收。
第二个版本会打印,结果。但是都会最先最后一个goroutine的代码。这是因为曹大昨天说的局部性原理吗?最后一个被加到runnext中,最先执行?
我的理解是启动瞬间,创建了很多goroutine,然后前面的还没有来得及抢占runnext,就被挤到P的队列去了,最后一个就最后抢占到runnext,所以 最后一个就最先执行。
1回答
这里的关键其实就是 GOMAXPROCS = 1,和 runnext,新创建的 g 优先级最高
这个结论不需要背,因为它在不同的 Go 版本中表现是不一样的,如果有人问这种问题,你能说清楚 runnext,local queue 和 global queue 就可以了
相似问题