golang timer 源码

西瓜啊贝贝 · · 741 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

(1)使用方法

timer := time.NewTicker(time.Duration(GAP) * time.Second)
for {
       select {
       case now := <-timer.C:
              fmt.Println(now)
       }
}

(2)NewTicker 函数

func NewTicker(d Duration) *Ticker {
        if d <= 0 {
                panic(errors.New("non-positive interval for NewTicker"))
        }
        // Give the channel a 1-element time buffer.
        // If the client falls behind while reading, we drop ticks
        // on the floor until the client catches up.
        c := make(chan Time, 1)
        t := &Ticker{
                C: c,
                r: runtimeTimer{
                        when:   when(d),  //下一次要触发的纳秒级时间,绝对时间(当前纳秒级时间+d)
                        period: int64(d),   //每次时间间隔,即d
                        f:      sendTime,   //写channel 函数
                        arg:    c,               //这里把c作为参数,有个细节的原因是Ticker.C 是receive-only type chan
                },
        }
        startTimer(&t.r)
        return t
}
type Ticker struct {
        C <-chan Time   //定时满足后,执行runtimeTimer 中 f 函数 写channel
        r runtimeTimer
}

type runtimeTimer struct {
        tb uintptr
        i  int
        when   int64         
        period int64
        f      func(interface{}, uintptr) // NOTE: must not be closure
        arg    interface{}
        seq    uintptr
}
func sendTime(c interface{}, seq uintptr) {
     select {
     case c.(chan Time) <- Now():
     default:
     }   
}  

有空继续


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:西瓜啊贝贝

查看原文:golang timer 源码

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

741 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传