当前位置: 首页 > 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.xdnf.cn/news/1253233.html

相关文章:

  • 【算法训练营Day21】回溯算法part3
  • vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能
  • DNS 服务器
  • 【golang】基于redis zset实现并行流量控制(计数锁)
  • 部署Web UI自动化测试平台:SeleniumFlaskTester
  • Maven入门到精通
  • Rust进阶-part5-trait
  • 机器学习——朴素贝叶斯
  • 19day-人工智能-机器学习-分类算法-决策树
  • NCD57080CDR2G 安森美onsemi 通用驱动器, SOIC, 8针, 20V电源, 8 A输出NCD57080CDR2电流隔离式栅极驱动器
  • 大模型后训练——Online-RL基础
  • 【嵌入式电机控制#26】BLDC:三相模拟采集
  • 江协科技STM32 15-1 FLASH闪存
  • LinkedList 深度解析:核心原理与实践
  • Docker 常用命令介绍
  • Linux 中 Git 操作大全
  • Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成
  • 初识神经网络01——认识PyTorch
  • docker-compose快速部署启动file beat+ELK
  • WMS及UI渲染底层原理学习
  • 完整的登陆学生管理系统(配置数据库)
  • 数字图像处理(冈萨雷斯)第三版:第四章——空间滤波与频域滤波(平滑与锐化)——主要内容和重点
  • 无人机航拍数据集|第6期 无人机垃圾目标检测YOLO数据集772张yolov11/yolov8/yolov5可训练
  • 当前主流GPU全景讲解:架构、功能与应用方向
  • 【模电笔记】—— 直流稳压电源——稳压电路
  • OpenCV校准双目相机并测量距离
  • linux下的串口通信原理及编程实例
  • Pytest项目_day04(Python做接口请求)
  • 笔记html模板
  • 大语言模型