不同版本的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处理不一样吗?
79
收起
正在回答
1回答
不同版本不是 runnext 不一样,而是 time.Sleep 不一样哈哈
这道题的标准答案其实要考虑两个东西:
runnext 的优先级,最近创建的优先级最高
time.Sleep 在老版本中会创建一个 goroutine,在 1.14(包含)之后不会创建 goroutine 了
如果被别人考到,能知道多级队列,以及 time 在 1.14 的这个变更就行了,我们后面应该会讲 timer,不过新版本挺复杂的
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星