后端开发【一大波有用知识】定时器方案红黑树,时间轮,最小堆

本文探讨后端开发中的定时任务组织,重点讲解红黑树、时间轮和最小堆在存储定时器中的作用。针对定时器误差问题,文中提出使用信号处理和epoll_wait结合的解决方案。此外,还介绍了单层级时间轮的实现和多线程使用时间轮的原因。文章最后讨论了不同定时方法,如socket选项、SIGALARM信号和I/O复用系统调用。
摘要由CSDN通过智能技术生成

目录:

  • 一、如何组织定时任务?

  • 定时器收网络IO处理造成误差特别大,该怎么处理?

  • 用何种数据机构存储定时器?

  • 红黑树如何解决相同时间的key值的?

  • 最小堆

  • 时间轮

  • 一个帮助理解单层级时间轮的例子

  • 如何解决空推进的问题?

  • 为什么多线程使用时间轮

  • 设计哪些接口,如何设计?

  • 满足哪些条件才能作为定时器的数据结构?

  • 二、定时的方法有哪些?

  • 究竟什么是定时?

  • 三、总结

一、如何组织定时任务?

首先,定时器组件通常和网络组件一起工作。举个最简单的例子来说:

int event=epoll_wait(epfd,ev,nev,timeout);
timeout作为参数值,<0为一直阻塞,=0相当于非阻塞检测双端队列就绪情况0代表立刻返回,>0数值表示最长阻塞的时间。在时间上需要应对的问题填入epoll_wait函数,就可以兼顾网络事件的处理和定时任务的处理。

定时器收网络IO处理造成误差特别大,该怎么处理?

  • nginx,redis中通过定时信号去处理+epoll_wait解决,nginx_timer_revolusion()函数定时发送时间信号会打断epoll_wait()的处理,让它尽快的处理定时事件,从而解决了误差较大的问题。很明显,如果网络IO处理事件时,会造成一定的误差。定时任务事件处理=epoll_wait处理时间+网络事件处理时间。

//第一种:通过发送定时信号去打断epoll_wait函数
while(!quit)
{
  int now=get_now_time();//单位:ms
  int timeout=get_nearest_time()-now;
  if(timeout<0)
      timeout=0;
  int nevent=epoll_wait(epfd,ev,nev,timeout);
  for(int i=0;i<nevent;i++)
  {
      //网络事件处理
  }
  update_timer();、//时间事件处理
}
单独开启一个线程,去处理定时任务。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值