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

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

图片描述
我分别用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回答

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


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

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

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


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


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

    2021-05-18 14:13:52
  • 哦,难怪1.14之前的版本9-goroutine是输出在最后,原来是time.Sleep()起的goroutine,把9-goroutine从runnext挤掉了,所以9-goroutine又去排队了,?

    2021-05-18 14:14:19
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师