在任务量大、性能要求高的场景,为了将任务存取及取消操作时间复杂度降为 O(1),会采用时间轮算法
什么是时间轮计时器
为解决高效调度任务而产生的调度模型,主要应用在延迟大规模的延时任务、周期性的定时任务等场景。
设计思想
- 根据时针的转动,按时间刻度去触发定时任务的执行。
- 单级时间轮只能装载固定刻度的定时任务,而多级时间轮能包含更多的定时器。
实现
基于延时队列来实现时间轮定时器,底层算法是堆排序。关于延时队列请参考:Go数据结构与算法(11)-延时队列
存储定时任务的底层是使用链表结构。
1 | package timewheel |
- 使用
1
2
3
4
5
6
7
8
9
10
11
func TestTimeWheel(t *testing.T) {
tw := New(time.Second, 8)
tw.Start()
defer tw.Stop()
tw.AfterFunc(time.Second, func() {
fmt.Println("start")
})
time.Sleep(time.Second * 5)
}
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2022/07/19/algorithm-timewheel/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!