定时器的使用
timer.lua
基于分级时间轮(Hierarchical Timing Wheel)实现的高性能定时器模块,提供了创建、取消、延长、循环、单次触发、剩余时间查询等功能。
性能特征
- create O(1)
- cancel O(1) —— 双向链表直接摘除
- extend O(1) —— cancel + create
- dispatch O(k) —— k = 当前 tick 到期数量
- 最大可调度延迟:67108863 ticks ≈ 671088 秒 ≈ 7.77 天
- 内置对象池复用,减少 GC 压力
常量
| 常量 | 值 | 说明 |
|---|---|---|
M.loop |
0 | 循环触发标记 |
M.second |
100 | 1秒 |
M.minute |
6000 | 1分钟 |
M.hour |
360000 | 1小时 |
M.day |
8640000 | 1天 |
创建定时器
M:new(expire, times, callback, …)
描述: 创建一个定时器对象
参数:
- expire (number): 过期时间 100等于1秒
- times (number): 次数,0表示循环触发
- callback (function): 回调函数
- … 回调参数
返回值:- timer_obj(table): 定时器对象
M:once(expire, callback, …)
描述: 创建一个单次触发的定时器(等同于M:new(expire, 1, callback, ...))
参数:
- expire (number): 过期时间 100等于1秒
- callback (function): 回调函数
- … 回调参数
返回值:- timer_obj(table): 定时器对象
M:new_loop(expire, callback, …)
描述: 创建一个循环定时器(等同于M:new(expire, 0, callback, ...))
参数:
- expire (number): 过期时间 100等于1秒
- callback (function): 回调函数
- … 回调参数
返回值:- timer_obj(table): 定时器对象
定时器对象方法
timer_obj:cancel()
描述: 取消定时器
返回值:- timer_obj(table): 自身,支持链式调用
timer_obj:after_next()
描述: 设置”之后下一次”模式:回调函数执行完再注册下一次,默认是先注册下一次再执行回调
返回值:- timer_obj(table): 自身,支持链式调用
timer_obj:extend(ex_expire)
描述: 延长定时器触发时间
参数:
- ex_expire (number): 延长时间 100等于1秒
返回值:- timer_obj(table): 自身,支持链式调用
说明:- 已取消或已完成的定时器调用无效
- 延长时间会在当前剩余时间基础上追加
- timer_obj(table): 自身,支持链式调用
timer_obj:remain_expire()
描述: 获取剩余触发时间
返回值:- remain(number): 剩余tick数,0表示已触发完或已取消
timer_obj:is_cancelled()
描述: 是否已被取消
返回值:- ret(boolean)
timer_obj:is_finished()
描述: 是否已完成(所有次数都触发了)
返回值:- ret(boolean)
timer_obj:is_loop()
描述: 是否是循环定时器
返回值:- ret(boolean)
timer_obj:remain_times()
描述: 剩余触发次数
返回值:- times(number): 剩余次数,0表示循环或已结束
timer_obj:is_valid()
描述: 定时器是否仍有效(未取消且未完成)
返回值:- ret(boolean)
timer_obj:release()
描述: 释放定时器对象,允许对象池回收复用
说明:
- 引用计数减1,当计数<=0且定时器已结束时归还对象池
- 如果忘记调用,对象由Lua GC自然回收(不会泄漏)
全局配置
M.set_warn_threshold(ticks)
描述: 设置回调执行耗时告警阈值
参数:
- ticks (number): 阈值(100=1秒),0表示不检测M.set_pool_max(max)
描述: 设置对象池最大缓存数量
参数:
- max (number): 最大数量,默认256
使用示例
1 | |
timer_point
使用基础的timer.lua模块,封装的整点报时功能,功能的概念类似闹钟,比如设置每天下午2点半第30秒,就只需要这样设置。
1 | |
目前支持设置的时间刻度有:
1 | |
new(type)
函数作用域:M 对象的成员函数
函数名称:new
描述: 创建整点报时对象
参数:
- type (number): 时间刻度类型set_month
函数作用域:M:new 对象的成员函数
函数名称:set_month
描述: 指定几月,如果刻度不是每年的话,这个设置没有作用
参数:
- month (number): 月份 1-12set_day
函数作用域:M:new 对象的成员函数
函数名称:set_day
描述: 每月第几天,超过适配到最后一天,比如设置31天,这月只有30天,适配到30天触发。
参数:
- day (number): 天数 1-31set_hour
函数作用域:M:new 对象的成员函数
函数名称:set_hour
描述: 几时
参数:
- hour (number): 几时 0-23set_min
函数作用域:M:new 对象的成员函数
函数名称:set_min
描述: 几分
参数:
- min (number): 几分 0-59set_sec
函数作用域:M:new 对象的成员函数
函数名称:set_sec
描述: 几秒
参数:
- sec (number): 几秒 0-59set_wday
函数作用域:M:new 对象的成员函数
函数名称:set_wday
描述: 周几(仅仅设置每周有效)
参数:
- wday (number): 周几 1-7 星期天为 1set_yday
函数作用域:M:new 对象的成员函数
函数名称:set_yday
描述: 一年第几天(仅仅设置每年第几天有效)
参数:
- yday (number): 第几天 1-366 超过适配到最后一天。builder
函数作用域:M:new 对象的成员函数
函数名称:builder
描述: 构建。
参数:
- callback (function): 回调函数。
- … (any): 回调参数。