• 欢迎大家分享资料!前往留言板评论即可!

Cron定时执行库

合宙 模组资料网 2年前 (2021-05-15) 321次浏览 0个评论 扫描二维码

使用方法

直接上代码:

--新建cron对象
local c = cron.Cron()
--设置回调,不要让这个函数被阻塞
c:SetCallBack(function (_,name)
    --回调函数返回的是这个cron的唯一名称
    log.info("cron trigger", name)
    --打印这个cron的配置
    log.info("cron info", name, c:Get(name))
end)

sys.taskInit(function ()
    --检查是否已经初始化(时间已同步)
    --如果是2g模块,记得同步时间
    while not c:Initial() do
        log.info("initial","waiting")
        sys.wait(1000)
    end

    log.info("cron initial", "done")

    --每分钟执行一次
    --负号代表*/
    --Add: (name,min,day,mon,year,week)
    --名称必须为唯一值
    --时间参数均可为空,默认为-1
    c:Add("test every 1 minute",-1,-1,-1,-1,-1)

    --每两分钟执行一次
    c:Add("test every 2 minutes",-2,-1,-1,-1,-1)

    --每小时45分种时执行一次
    c:Add("test at 45 minute",45,-1,-1,-1,-1)

    --打印所有cron的配置
    local list = c:List()
    for i=1,#list do
        log.info("cron info", list[i], c:Get(list[i]))
    end
end)

点我下载cron.lua

源码

本库使用moonscript编写,点我下载cron.moon

--定时器组件
module ..., package.seeall

export class Cron
    --是否初始化完成
    initial: false
    --待处理的事件篮子
    basket: {}
    --回调函数
    cbFunc: nil
    --是否开启
    enable: true

    --检查时间是否匹配
    check = (set,time)->
        if set < 0
            return time%(-set) == 0
        else
            return set == time

    --循环执行检查,一分钟一次
    run: =>
        sys.taskInit ->
            next = (os.date "*t").sec
            sys.wait (60-next)*1000
            while true
                return unless @enable--对象停止后结束任务
                t = os.date "*t"
                for i, v in pairs @basket
                    if (check v.min,t.min) and
                        (check v.day,t.day) and
                        (check v.mon,t.month) and
                        (check v.year,t.year) and
                        (check v.week,t.wday)
                        @cbFunc i if @cbFunc
                next = (os.date "*t").sec
                sys.wait (61-next)*1000--+1s

    --定时器初始化
    Initial: =>
        return true if @initial
        --开机后默认时间肯定是2020年之前
        @initial = (os.date "*t").year >= 2020
        @run! if @initial
        @initial

    --新建对象后的事件
    --新建的时候顺带检查一下初始化状态
    new: =>
        @Initial!

    --设置回调函数
    --定时器触发后,会调用该函数
    SetCallBack: (func) =>
        @cbFunc = func

    --添加要执行的cron事件
    --name为定时器名称,唯一值,不可重复
    Add: (name,min=-1,hour=-1,day=-1,mon=-1,year=-1,week=-1) =>
        @basket[name] = {:min,:hour,:day,:mon,:year,:week}

    --去掉cron事件
    --name为定时器名称,唯一值,不可重复
    Del: (name) =>
        @basket[name] = nil

    --查看cron事件配置
    --name为定时器名称,唯一值,不可重复
    Get: (name) =>
        return unless @basket[name]
        @basket[name].min,@basket[name].day,@basket[name].mon,@basket[name].year,@basket[name].week

    --获取cron名称列表
    List: =>
        k = {}
        for i in pairs @basket
            table.insert k,i
        k

    --销毁对象,停止所有定时器任务
    Distory: =>
        @enable = nil

转载请注明原文链接:Cron定时执行库
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址