基于层级时间轮实现的定时调度框架; 零依赖第三方包
- TimingWheels论文
- 实现过程中借助了kafka中时间轮的思想
- 自建延时队列
go get -u github.com/maolinc/quartz
// 创建调度器,tick间隔周期, wheelSize时间轮格子
scheduler := NewTimingWheel(tick time.Duration, wheelSize int64)
- 单次任务
scheduler := NewTimingWheel(time.Millisecond*10, 60)
scheduler.Run()
result := scheduler.AfterFunc(time.Second, func(ctx context.Context) {
// todo
})
// 停止任务
result.Stop()
- 周期任务
scheduler := NewTimingWheel(time.Millisecond*10, 60)
scheduler.Run()
// 任务1
result := scheduler.ScheduleFunc(time.Second, func(ctx context.Context) {
// todo
})
// 任务2
result2 := scheduler.ScheduleFunc(time.Second, func(ctx context.Context) {
// todo
})
// 暂停
result.Pause()
// 继续
result.Continue()
// 停止任务,只会停止任务1,任务停止后对任务在操作便失效
result.Stop()
// 停止所有任务
scheduler.Stop()
使用延时队列解决空转性能消耗,所有任务都存放在链表中,即任务的添加和删除时间复杂度O(1)