Goroutine启动与初始化的顺序

来源:1-4 Go 程序是怎么跑起来的

拧壶冲

2021-05-16 11:15:08

昨天曹大布置了一个代码问题,要求自行下去运行观察结果

http://img.mukewang.com/climg/60a08c5408e4a97720060936.jpg

使用 channel的版本会死锁。因为channel必须有一对接/收。


第二个版本会打印,结果。但是都会最先最后一个goroutine的代码。这是因为曹大昨天说的局部性原理吗?最后一个被加到runnext中,最先执行?


我的理解是启动瞬间,创建了很多goroutine,然后前面的还没有来得及抢占runnext,就被挤到P的队列去了,最后一个就最后抢占到runnext,所以 最后一个就最先执行。

写回答

1回答

Xargin

2021-05-16

这里的关键其实就是 GOMAXPROCS = 1,和 runnext,新创建的 g 优先级最高


这个结论不需要背,因为它在不同的 Go 版本中表现是不一样的,如果有人问这种问题,你能说清楚 runnext,local queue 和 global queue 就可以了

3

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程