分享
  1. 首页
  2. 主题
  3. Go问与答

select超时优先级

LovesAsuna · · 3799 次点击 · 开始浏览 置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

# 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 次点击
4 回复 | 直到 2021年07月02日 11:52:22
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)