当前位置: 首页 > news >正文

时间轮算法

延迟任务的实现:

  1. 优先队列存储任务,时间精度比较好 ,但是插入元素的时间是O(log(N)),元素多的时候比较慢,也就是无法满足大吞吐量的要求
  2. 时间轮,牺牲了时间精度,插入的时间复杂度是O(1);需要高吞吐的组件维持大量延迟任务,并且对及时性要求不高,比如IO事件处理

https://gitee.com/bossDuy/timewheel/blob/master/README.md

时间轮

原理

核心组成:

  • 时间轮盘(数组):整个环形数据结构
  • 基准时间:数组中表示时间都是按照这个基准来表示的,第一个0-99ms就是 基准时间+0-99ms
  • 槽位(slot):时间轮上的分隔,每个槽位表示一段时间间隔
  • 指针:指示当前时间,随时间推移顺时针移动
  • 任务链表:挂载在每个槽位上的待执行任务集合
    在这里插入图片描述

比如,我们设定一个slot为100ms,那么具体队对应的任务应该放到哪一个时间槽如下

因为每一个槽都是100ms,所以对于时间轮来讲 10ms和99ms 都是应该同时执行的,正如前面所说,时间轮牺牲了时间的精准度换得取任务时间复杂度为O(1)

对于超过数组长度所表示的时间,使用 目标时间对数组最大表示时间取余

在这里插入图片描述

实现的话可以通过数组和链表表示延时任务,时间轮通过定时的取扫描当前槽的任务是否需要执行

  • 扫描的时候是需要扫描整个链表(存储任务的)的,还是O(N),但是不需要扫描所有的延迟任务,被数组切割开了
  • 插入任务的时候,只需要把任务计算到对应的位置然后插入,时间复杂度是O(1)
http://www.lryc.cn/news/611642.html

相关文章:

  • Java学习第一百一十一部分——Jenkins(二)
  • docker-compose快速部署启动file beat+ELK
  • Git 分支管理:从新开发分支迁移为主分支的完整指南
  • Agent安全机制:权限控制与风险防范
  • 商派小程序商城(小程序/官网/APP···)的范式跃迁与增长再想象
  • C语言基础_排序算法和二分法查找
  • GROUP BY与ORDER BY的索引优化方法
  • 脑洞大开——AI流程图如何改变思维?
  • 深入解析Java NIO在高并发场景下的性能优化实践指南
  • 企业网络安全中人工智能(AI)的影响
  • 使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)
  • HTML应用指南:利用GET请求获取全国OPPO官方授权体验店门店位置信息
  • nlp-词汇分析
  • easyExcel 读取有合并单元格数据
  • EasyExcel高效工具类:简化Excel导入导出,支持多Sheet与枚举转换
  • QT----QAxObject在子线程中调用,发现excel指针为空
  • Excel制作尖刀图,直观展示业绩涨跌
  • EXCEL-业绩、目标、达成、同比、环比一图呈现
  • 从“T+1”到“T+0”:基于SQL构建MES到数据仓库的数据采集通道
  • OpenGL VBO:顶点缓冲对象的深度解析
  • 点穴式优化:用DeepSeek精准识别关键节点的产品体验突破法
  • PostgreSQL报错“maximum number of prepared transactions reached”原因及高效解决方案解析
  • 推荐一款优质的开源博客与内容管理系统
  • Mac安装WebStorm
  • C++11实现线程池(2)固定线程池
  • Java Stream API 详解(Java 8+)
  • 云计算一阶段Ⅱ——12. SELinux 加固 Linux 安全
  • 8.6学习总结
  • AI增强的软件测试工具
  • 网站、域名、IP在什么场景下需要备案