golang中timer和ticker 都属于time包

timer是一次性定时器,执行完一次就结束了,ticker是周期性定时器,周而复始的执行。二者在数据结构上完全一样,都是一个对外的channel + 对内的runtimeTimer。

type Timer struct {C <-chan Timer runtimeTimer
}
type Ticker struct {C <-chan Time // The channel on which the ticks are delivered.r runtimeTimer
}

一:Timer常用的使用方式:

1:timer = time.NewTimer(1 * time.Second) timer.Stop() timer.Reset()

2: <-time.After(1 * time.Second)

3:time.AfterFunc(1 * time.Second,callback)

二:Ticker常用的使用方式:

1:ticker = time.NewTicker(1 * time.Second) ticker.Stop() for range ticker.C

2:<-time.Tick(1 * time.Second)

三:runtimeTimer结构

type runtimeTimer struct {tb *timersBucket                    // 存储当前定时器的数组地址i  int                              // 存储当前定时器的数组下标when   int64                        // 当前定时器触发时间period int64                        // 当前定时器周期触发间隔f      func(interface{}, uintptr)   // 定时器触发时执行的函数arg    interface{}                  // 定时器触发时执行函数传递的参数一seq    uintptr                      // 定时器触发时执行函数传递的参数二(该参数只在网络收发场景下使用)
}

timer和ticker 唯一的区别就是在period上,为timer时其值恒为0,为ticker时其值就是循环周期。

四:实现原理

func NewTimer(d Duration) *Timer {c := make(chan Time, 1)  // 创建一个管道t := &Timer{ // 构造Timer数据结构C: c,               // 新创建的管道r: runtimeTimer{when: when(d),  // 触发时间f:    sendTime, // 触发后执行函数sendTimearg:  c,        // 触发后执行函数sendTime时附带的参数},}startTimer(&t.r) // 此处启动定时器,只是把runtimeTimer放到系统协程的堆中,由系统协程维护return t
}func NewTicker(d Duration) *Ticker {if d <= 0 {panic(errors.New("non-positive interval for NewTicker"))}c := make(chan Time, 1)t := &Ticker{C: c,r: runtimeTimer{when:   when(d),period: int64(d), // Ticker跟Timer的重要区就是提供了period这个参数,据此决定timer是一次性的,还是周期性的f:      sendTime,arg:    c,},}startTimer(&t.r)return t
}func sendTime(c interface{}, seq uintptr) {select {case c.(chan Time) <- Now():default:}
}

sendTime 表示定时器时间到了执行的api。

timer触发时不会阻塞,因为channel是有缓冲的,把当前的时间塞进去就完事儿了,但是ticker不太一样,ticker 是不断的塞 万一对方没有及时把时间从channel中读走,这个时候sendTime只能执行default了,这次塞数据的操作会被丢弃。

startTimer 就是把当前的timer or ticker 交给系统协程。

系统有专门的协程管理着所有的timer or ticker,并不是每一个timer or ticker就有一个对应的协程,如果真的是那样的,启动几百个定时器 岂不是要有几百个协程跟着服务 这样效率也太低了。

系统协程有64个,每个系统协程通过四叉堆管理着其下属的定时器,添加/删除都会涉及到堆的调整,

Go专家编程 timer、ticker相关推荐

  1. C专家编程(Expert C Programming)1

    C专家编程(Expert C Programming) 一基本概念 1.与时间相关的几个函数 char *ctime( const time_t *timer ); Each of these fun ...

  2. c专家编程/c陷阱_如何避免常见的初学者陷阱并像专家一样开始编码

    c专家编程/c陷阱 by Dmitri Grabov 德米特里·格拉波夫(Dmitri Grabov) 如何避免常见的初学者陷阱并像专家一样开始编码 (How to avoid common begi ...

  3. 一篇特别长的总结(C专家编程)

    博客链接: http://codeshold.me/2017/02/expert_c_programming.html 读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了 ...

  4. C专家编程—使用unsigned int可能产生的Bug(1)

    在vs2008环境下,如下代码显示不同的结果: #include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0 ...

  5. Python专家编程

    Python专家编程 一.CPython CPython是一个默认的.广泛使用的Python编程语言的实现.CPython是用C语言写的.除了CPython,还有两个高质量的Python实现:一个是J ...

  6. 《C陷阱与缺陷》和《C专家编程》两本书又翻印了

    今天花了几个小时逛书店,偶然让我发现了<C陷阱与缺陷>和<C专家编程>这两本书.这让我很惊喜,喜欢收集书的我当然不会错过,一口气,两本书都收录了. 其实这两本我都已经下载了电子 ...

  7. 《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

    本节书摘来自异步社区<JavaScript专家编程>一书中的第1章,第1.1节,作者:[美]Mark Daggett(达格特)著,更多章节内容可以访问云栖社区"异步社区" ...

  8. 《C专家编程》一1.6 它很棒,但它符合标准吗

    本节书摘来自异步社区<C专家编程>一书中的第1章,第1.6节,作者 [美]Perter Van Der Linde,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  9. 《C专家编程》随笔1:读者心得

    自己在阅读完<C和指针>和<C陷阱与缺陷>之后,结合实际的项目,对C语言有了一定熟悉. <C和指针>是一本非常不错的C语言基础书,详细介绍了C语言的知识点,相对于谭 ...

最新文章

  1. 开发者被要求向破解者道歉,竟揪出“阿里云假员工”,网友:这人有前科
  2. angular directive 深入理解
  3. jsf 自定义属性_如何在JSF中实现自定义密码强度指示器
  4. jQuery (二)
  5. VB讲课笔记05:数据输入输出
  6. 间接寻址级别不同_「计算机组成原理」:常见的指令寻址方式
  7. Ext JS 6应用程序Build后出现“c is not a constructor return new c(a[0])”的处理
  8. java.io.serializable_java.io.Serializable浅析 | 学步园
  9. Mobile开发之meta篇
  10. imagej得到灰度图数据_ImageJ的高级使用方法
  11. 路由器/交换机/服务器的分类
  12. VBA和Excel学习记录
  13. 12306火车票余票自动查询 Python selenium
  14. win10小课堂:微信电脑端多开方法
  15. unite 2019 上海,东京,首尔,哥本哈根,悉尼 的视频/资料
  16. 第五届“强网”拟态防御国际精英挑战赛——线上预选赛火热开赛!
  17. “不老时代”:细说nmn是什么产品?nmn功效与作用是真的吗?
  18. 华为与android连接方法,华为手机怎样与电脑连接?安卓手机连接电脑的方法介绍...
  19. 快速查询出中通快运物流信息,将信息导出EXCEL表格
  20. 有偏估计 and 无偏估计

热门文章

  1. 学习笔记之Vue基础学习(一)
  2. ChatGPT专业应用:自动生成长尾关键词
  3. 云计算高级运维第一阶段项目实战:在局域网中使用 awl 伪装 MAC 地址进行多线程 SYN 洪水攻击
  4. 读《深入浅出MySQL数据库开发、优化与管理维护(第2版)》笔记2 WITH ROLLUP关键字
  5. 小程序wx.downloadFile下载pdf并保存
  6. 至少12亿元收支差,分析运营商7大数据产品应用
  7. 【微信开发|PHP】设置关注自动回复,关键词自动回复。
  8. windows Server 2012修复(CVE-2016-2183)(CVE-2013-2566)(CVE-2015-2808)
  9. 计算机图形学椭圆Java代码,【计算机图形学】二、椭圆的生成
  10. 【pwn】长安杯baigei