不同版本的runnext,处理是不是不一样?

来源:1-3 【课前预习】

weixin_慕工程8224461

2021-05-16 18:03:43

图片描述
我分别用go version 1.6和1.15.5跑了下,输出如下

go version 1.6

左边

A: 9  
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
	/root/go-work/src/test-code/output/main.go:18 +0x98
exit status 2

右边

A: 0    //这里跟go version 1.15.5不一样,
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
A: 9
^Csignal: interrupt

go version 1.15.5

左边

A: 9
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
	/root/go-work/src/test-code/output/main.go:18 +0x96
exit status 2

右边

A: 9     //这里跟go version 1.6的输出不一样
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
^Csignal: interrupt

看了下go 1.6和go 1.15.5都有runnext这个字段,难道是scheduler处理不一样吗?

写回答

1回答

Xargin

2021-05-16

不同版本不是 runnext 不一样,而是 time.Sleep 不一样哈哈


这道题的标准答案其实要考虑两个东西:

  1. runnext 的优先级,最近创建的优先级最高

  2. time.Sleep 在老版本中会创建一个 goroutine,在 1.14(包含)之后不会创建 goroutine 了


如果被别人考到,能知道多级队列,以及 time 在 1.14 的这个变更就行了,我们后面应该会讲 timer,不过新版本挺复杂的


2
heixin_慕工程8224461
hp>哦,难怪1.14之前的版本9-goroutine是输出在最后,原来是time.Sleep()起的goroutine,把9-goroutine从runnext挤掉了,所以9-goroutine又去排队了,?

h021-05-18
共2条回复

Go高级工程师实战营

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

458 学习 · 266 问题

查看课程