概述
定时器(Timer Facility)被用于处理延时任务。
有多种数据结构和算法可以实现定时器,包括最小堆,哈希轮,分级时间轮等。在这篇文章中主要介绍基于最小堆的定时器的实现。
原理
最小堆指的是满足除了根节点以外的每个节点都不小于其父节点的堆。这样,堆中的最小值就存放在根节点中,并且在以某个结点为根的子树中,各节点的值都不小于该子树根节点的值。
最小堆其实就是最小优先队列,将新的定时器添加到堆中,根据绝对到期时间完成最小堆的有序化。
在每个时钟周期比较堆顶的定时器的到期时间和当前的时钟,如果定时器的到期时间是小于当前时间,则执行并删除到期定时器; 继续这样做这样的比较,直到堆顶包含一个过期时间大于当前时间的计时器。
操作
基于最小堆的定时器包含的操作包括
- 插入定时器。该操作的时间复杂度为O(lgn)
- 获取最先超时的定时器。由于是最小堆,只需返回堆的root即可,此时的算法复杂度为O(1) 。
- 在定时器到期后,执行相关的动作,它的算法复杂度为 O(1) 。
实现
具体的Go语言实现如下
1 |
|
参考
https://www.ibm.com/developerworks/cn/linux/l-cn-timers/
http://www.lpnote.com/2017/11/16/hashed-and-hierarchical-timing-wheels/