文档章节

基于时间轮的任务超时控制

zhangwei_2943
 zhangwei_2943
发布于 2015/01/20 17:46
字数 509
阅读 129
收藏 1

    平时我们在写程序的时候很多情况下都会遇到任务超时处理的业务情况(比如说调用一个后台的api接口如果超过5秒没有返回数据就出发超时的业务逻辑),针对这种业务平时我们都是使用一个线程+timer来实现。

这个实现方式本身是没有问题的,但是如果遇到同时又N多个需要处理超时的业务函数,这种情况下如果还给每个超时都用一个线程来控制势必会降低很多性能

    这里提出了一个新的概念《基于时间轮算法》来控制任务超时,可以将这个算法简单的理解为时钟,在时钟的每一个格子里面添加一个任务队列,任务队列里面是相应的超时任务.秒表会每隔固定的时间转动一次时间轮,

当秒表执行的格子里面有超时任务存在时就执行这个超时任务(通过这种方式就可以实现 一个线程控制多个超时任务)极大的提升了系统效率。

    时间轮算法可以通过下面这张图来分析具体逻辑

   

时钟可以分为 秒针/分针/时针,以最小单位作为时间轮的运行轨迹,在添加任务的时候根据最小单位和超时时间计算出 时间轮的 周期+卡槽位置,时间轮在跳转的时候每次都会检查卡槽是否有超时任务队列存在,如果有在判断 周期是否满足,如果都满足条件则出发 超时执行。

下面这个代码库 就是用go写的一个具体实现,已经在生产环境稳定运行,有需要的朋友可以直接使用

https://github.com/zhangwei1234/go-timer-wheel.git


© 著作权归作者所有

共有 人打赏支持
zhangwei_2943
粉丝 0
博文 3
码字总数 1832
作品 0
成都
架构师
Timer 源码解读[连载2]

转自: https://github.com/yjhjstz/deep-into-node Timer源码解读 涉及源码 lib/timers.js src/timerwrap.cc deps/uv/src/unix/timer.c deps/uv/src/heap-inl.h 主要分为 javascript 层面的......

_朴灵_
05/14
0
0
C基础库--libfastcommon

libfastcommon是一款开源的C基础库,她是从FastDFS项目中剥离出来的C基础库。这个库非常简单、高效和稳定,提供的函数主要包括如下几类: string:字符串处理; logger:日志记录,支持日志轮...

fastdfs
2017/03/08
412
0
分布式计划任务设计与实现

分布式计划任务设计与实现 http://netkiller.github.io/journal/scheduler.html 版权 © 2014 http://netkiller.github.io 2014-09-30 目录 1. 什么是分布式计划任务 2. 为什么采用分布式计划...

neo-chen
2014/09/30
2.6K
3
用Erlang实现Time Wheel

游戏开发总会要用到timer,离不开定时器的使用。像界面需要定时去绘制更新界面,后端也需要来定时执行逻辑,驱动事件。条条道路通罗马,就看你使用技巧好不好了。 一般服务器都是10ms一个tic...

rongtou
2016/12/27
41
0
并发流程控制--cocoflow

Concurrency Control Flow 并发流程控制 一个基于协程和libuv的C++框架,仅通过 start、 await、 allof、 any_of 控制流程。 基于 协程(Coroutine) & libuv 的C++开发框架 使用 start | awai...

chishaxie
2013/10/21
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

71.告警系统主脚本 配置文件 监控项目

20.20 告警系统主脚本(main.sh) 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本(main.sh): ~1.约定:把以后所有的shell脚本放在/usr/local/sbin下,也方便我们查...

王鑫linux
19分钟前
0
0
装饰者模式

装饰者模式 Q:何为装饰模式? ()地给一个对象添加一些额外的(),并且()时,并不影响原对象。扩展功能来说,装饰器模式相比生成子类更为灵活。 Q:使用场景? 1.想要在不影响其他对象的情况下...

阿元
39分钟前
0
0
GO 切片(slice)相关语法

package mainimport("fmt")func main() {var intArr [5]int = [...]int{1,2,3,4,5} //定义一个数组slice := intArr[2:4] //第二个(包含)下标到第四个下标(不包含)fmt.Println...

汤汤圆圆
41分钟前
0
0
活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
55分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部