schedule
简介
计划任务,定时/循环触发某个任务
提示
- 热更新期间,任务列表保留,协程启动后遍历检查,从而天然支持热更新
- 算法“exec_time = exec_time + interval”保证了time.shift的支持
组件接口
schedule.gs
类
ScheduleTask
计划任务基础类
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| name | string | nil | 可选 | 任务名称 |
| func | function | nil | 可选 | 任务执行函数 |
| period_time | SchedulePeriodTime | nil | 可选 | 任务周期 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| void exec() | 执行任务 |
ScheduleTaskList
计划任务列表
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| list | array | nil | 可选 | |
| semarphore | sync_object | nil | 可选 |
成员方法
SchedulePeriodTime
周期时间
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| now | int | -1 | 可选 | 本周期时间 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| string desc() | 获取描述 |
| bool update() | 更新周期时间 |
| int time() | 获取周期时间 |
| int diff(int t) | 计算时间差 |
| bool is_early_than(int t) | 判断是否早于指定时间 |
| bool is_late_than(int t) | 判断是否晚于指定时间 |
| int calc_next_period_time() | 计算下一周期时间 |
YearSchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1年的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
MonthSchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1月的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
WeekSchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1周的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_time(int base_time, int ch_wday, int hour, int minute, int second) | |
| int calc_next_period_time() | 计算周期的下一个时间 |
DaySchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1天的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_time(int base_time, int hour, int minute, int second) | |
| int calc_next_period_time() | 计算周期的下一个时间 |
HourSchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1小时的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
MinuteSchedulePeriodTime
继承自 SchedulePeriodTime
间隔时长为1分钟的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
SecondSchedulePeriodTime
继承自 SchedulePeriodTime
周期间隔时长为1秒的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
FixedSchedulePeriodTime
继承自 SchedulePeriodTime
固定时长的计划周期
成员变量
| 变量名 | 类型 | 初始值 | 须初始化 | 描述 |
|---|---|---|---|---|
| period_seconds | int | -1 | 可选 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| int calc_next_period_time() | 计算周期的下一个时间 |
样例
void test()
{
queue q = queue.create("test_schedule");
defer q.close();
// 定时触发
schedule.create_task("test01", (: q.send_raw, "test01" :), time.time() + 1);
schedule.create_task("test02", (: q.send_raw, "test02" :), time.time() + 2, nil, true);
schedule.create_task("test03", (: q.send_raw, "test03" :), time.time() + 3, nil, true);
gtest.test_equal(q.receive(), "test01");
gtest.test_equal(q.receive(), "test02");
gtest.test_equal(q.receive(), "test03");
// 每天5点定时触发
map daily_times = {
"times" : [
{ "hour" : 5 }
]
};
function daily_func = () {
printf(HIR "daily repeat\n" NOR);
};
array arr1 = schedule.create_scheme_format("test11", daily_func, "day", daily_times);
for (string task_name : arr1)
gtest.test_equal(schedule.get_task(task_name) != nil, true);
// 每周一8:00定时触发
map weekly_times = {
"date" : [ 1 ],
"times" : [
{ "hour" : 8 }
]
};
function weekly_func = () {
printf(HIR "weekly repeat\n" NOR);
};
array arr2 = schedule.create_scheme_format("test12", weekly_func, "week", weekly_times);
for (string task_name : arr2)
gtest.test_equal(schedule.get_task(task_name) != nil, true);
// 删除计划任务
for (string task_name : arr1 + arr2)
schedule.delete_task(task_name);
// 查看是否删除成功
gtest.test_equal(schedule.get_count(), 0);
}