不同版本的runnext,处理是不是不一样?
来源:1-3 【课前预习】
weixin_慕工程8224461
2021-05-16 18:03:43
我分别用go version 1.6和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 +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
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 不一样哈哈
这道题的标准答案其实要考虑两个东西:
runnext 的优先级,最近创建的优先级最高
time.Sleep 在老版本中会创建一个 goroutine,在 1.14(包含)之后不会创建 goroutine 了
如果被别人考到,能知道多级队列,以及 time 在 1.14 的这个变更就行了,我们后面应该会讲 timer,不过新版本挺复杂的
相似问题