时间轮定时器,仿linux内核,一个毫秒级一个100毫秒级,支持C++/go/js语言

https://github.com/uniqss/uniqstimer

五个轮 每个轮里面有256个槽 精度1MS

总共256*5=1280个槽 总共是2^40=1,099,511,627,776MS =12,725.829天 =34.865年

34年,应该一般的场景够用了。适用于时间精度要求非常高的场景(精度毫秒),比如帧同步里的BUFF。

uniqstimerIII: 五个轮 每个轮里面有64个槽 精度100MS

总共64*5=320个槽 总共是2^30= ‭1,073,741,824‬ 单位:百毫秒 =‭107,374,182.4‬秒 =‭1,242.757天 =3.4年 3年多,一般的场景够用。适用于时间要求精度不是非常高(100MS以内)的场景。比如各种排行榜结算、比如玩家隔天凌晨4点刷新、比如月卡、比如心跳、比如登录空SESSION超时等等。

TIMER有一个问题:如果频繁删除时间非常非常长的定时器,会导致进程的内存会越来越多 有很多定时器被标记为Killed状态,躺在高级的时间轮里面,要轮到的时候才会清。

如果是在MMO里用,添加TIMER的时候尽量避开非常频繁地删除时间特别长的定时器(持续特别长但中间会触发的不算在此列,这里是指首次触发就特别长)

相同的TimerId不能重复 可以在_helper里面自己定义用池或者是定义分配和释放策略

c++有两种用法,一种用timerId去管理(CreateTimer/KillTimer),一种直接持有指针(CreateTimerMem/KillTimerMem)

时间轮定时器的实现,没有使用任何线程间同步的机制,所以不是线程安全的,一定要在同一个线程中创建、删除、Run

posted @ 2020-10-26 10:21  uniqs  阅读(359)  评论(0编辑  收藏  举报