分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
# select中的超时优先级
> select中可以通过在case设置time.After进行超时,但为什么超时操作会比其他的case优先级低?如果其他的case会运行那么超时就不作数。为此我在主协程模拟了一个超时
```go
func main() {
channel := make(chan interface{}, 100)
delay := make(chan interface{})
for i := 0; i < 10; i++ {
channel <- 1
}
go func() {
for {
select {
case <-delay:
fmt.Println("超时")
case i := <-channel:
fmt.Println(i)
time.Sleep(time.Second)
}
}
}()
time.After(3 * time.Second)
delay <- 1
for {
}
}
```
结果打印如下
```
1
超时
1
1
1
1
1
1
```
* 这样的结果很符合我对"超时"的认知,函数的超时只取决于调用者本身而不是取决于函数中的状态。
---
> 而正常的select却不是这样的,我做了这样的对比只是印证了time.After内部的实现原理与我写的不一样
查看源码可以发现time.After实际上是调用了NewTimer,NewTimer的源码是这样的
```go
func NewTimer(d Duration) *Timer {
c := make(chan Time, 1)
t := &Timer{
C: c,
r: runtimeTimer{
when: when(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}
```
* 可以看出time.After其实是返回了NewTimer内部定义的Timer的C。
* 而我认为问题的关键就在于下面的startTimer,其中肯定有往C输入内容的管道。往C输入内容的时机就是问题的答案。
* 由于源码过于复杂比较难分析,因此想问问这个优先级的原因出在哪里?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3799 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传