时间轮python_GitHub - JAYqq/GoDelayTasks: 基于时间轮的延时任务队列

博客介绍了延时任务队列的发展历程,从简单的单级时间轮到多级时间轮,再到利用位运算优化的时间轮设计。通过这种方式,不仅可以提高任务插入的灵活性,还能大大增加可承载的任务数量和时间跨度,同时确保高精度和低延迟。文章特别提到了使用monotonic时间来避免系统时间调整带来的影响,确保任务执行的准确性。
摘要由CSDN通过智能技术生成

延时任务队列

思路发展历程

第一阶段 单级时间轮

一个有60刻度的时间轮,每个tick一秒钟,主线程持续走动timer,当有新的任务到来交给工作线程创建。

优点

实现简单

缺点

当同一时刻有多个任务时无法插入

可承载任务过少只有60个

第二阶段 单级双向链表时间轮

一个有3600刻度的时间轮,每个tick表示一秒钟,最多延时一个小时,每个时间槽为一个 双向循环链表,这样可以在同一时刻保存多个任务。

优点

实现了同一时刻多个任务的保存

扩大了可承载任务到1小时

缺点

时间跨度还是太小只有一小时

时间精度太低

第三阶段 多级时间轮

68747470733a2f2f6d6d62697a2e717069632e636e2f6d6d62697a5f6a70672f585a4d69637067635969625846344f7a7866366961696264566e6f3974665054466747556544503139736a766d616c6b42344739595366686d625066545635705441794453646349624b713048646669614e477a784742514d6e772f3634303f77785f666d743d6a7065672674703d7765627026777866726f6d3d352677785f6c617a793d312677785f636f3d31

和时间的表示一样,按照天、小时、分、秒、毫秒分为五个时间轮,这样可表示的跨度理论上到了一年(某天某小时某分钟某秒某毫秒),每个tick为一毫秒,同样每个时间槽都是双向循环链表。

优点

跨度变大,足够使用

时间精度够高,对于高精度的延时任务有保障

缺点

实现较为复杂,对于每一层时间轮的过期任务需要往后移动,每一级时间轮之间的依赖性太强

依赖服务器设置时间,如果修改了系统时间后所有任务受影响

第四阶段

主要的改变(参考Netty的时间轮实现),利用位的概念设计时间(虽然是参考标准时间小时、分钟、秒这样的实现,但是不要被这个概念框限住)。根据一个时间来分时间轮级别,我们将一个时间表示为32位的时间,分为

一级时间轮,低8位,表示0~256毫秒的延时任务,tick单位是一毫秒

二级时间轮,次6位,表示256~256*64毫秒的延时任务,tick单位是256毫秒,也就是每256毫秒走动一次

三级时间轮,低第二个6位,表示256~256 * 64 * 64毫秒的延时任务,tick单位是256 * 64毫秒,也就是每64 * 256毫秒走动一次

四级时间轮,低第三个6位,表示256~256 * 64 * 64 * 64毫秒的延时任务,tick单位是256 * 64毫秒,也就是每64 * 64 * 256毫秒走动一次

五级时间轮,低第四个6位,表示256~256 * 64 * 64 * 64 * 64毫秒的延时任务,tick单位是256 * 64 * 64 * 64毫秒,也就是每64 * 256毫秒走动一次

这样最大的好处就是每个时间段的延时任务分到了五个不同时间轮,并且可以使用位运算进行时间槽流转,相对于加减乘除运算速度也更快

并且计时系统使用的是 monotonic 时间,它表示从系统启动这一刻起到现在的时长。不受系统时间被用户修改的影响。如果系统不支持 monotonic 时间的话,就可能出现用户修改系统时间,导致计时器混乱的情况。如果出现这种情况,需要进行时间校正。代码中使用了 monotonic 时间,无需时间校正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值