用Golang实现一个时间轮

820 阅读1分钟

常见的定时器实现方式有两种:

  • 最小堆
  • 时间轮

最小堆插入操作的时间复杂度是O(logn),比如ScheduledThreadPoolExecutor的DelayedWorkQueue,而时间轮的实现,插入只需要o(1),在到期删除时的时间复杂度也是o(1)

KZlN5j.png

时间轮又分为单层和多层,多层主要解决时间溢出问题,也可以用单轮多圈的实现,这里用golang写了一个单轮多圈的实现,测试代码...

KZJCXq.png

这里生成了一个最小时间刻度为100ms、有1024个槽的时间轮, tw.AddScheduleTask 表示添加一个定时任务,测试结果为:

KZJZh4.png

其它也没啥写的...具体看源码和测试代码吧...

源码地址:Github