周期性定时器–Ticker,定时器周期的进行计时,除非注定停止,否则永远运行
一、Ticker
一、结构
1 | type Ticker struct { |
此处和Timer的结构一毛一样。
- C 管道类型的变量,上层调用者通过此管道接收事件。
- r runtime定时器,该定时器即系统管理的定时器,上层不可见。
当定时器过期,当前时间会被发送到C上。除非定时器是通过AfterFunc创建。
二、代码结构
1 |
|
- NewTicker 创建方法,返回一个周期为d的定时器。
- Stop 停止当前Ticker。并不会向定时器的管道中写入事件,管道也不会被关闭。管道在生命周期结束后会自动关闭。
- Tick 返回一个通道,但是底层还是会创建一个Ticker。
三、底层实现
1、NewTicker
1 | func NewTicker(d Duration) *Ticker { |
方法中初始化一些必要的变量信息,然后通过startTimer()交给系统协程维护。
when()是计算下一次定时器触发的绝对时间。
startTimer()是定时器触发时的动作。
这也和Timer区别不大,只是增加了period字段保证周期性执行
2、Stop
1 | func (t *Ticker) Stop() { |
此处致使简单的把Timer从系统协程中移除。但是并不会关闭通道。
和Timer区别不大,但是并没有返回值。
3、Tick
1 | func Tick(d Duration) <-chan Time { |
我特么没啥想说的……