DEV Community

drake
drake

Posted on

python 用 croniter 解析crontab语法,实现定时调度的问题

  • 想实现的事拿当前时间和最近的一个调度时间做对比,但是cron对象没有这么个属性可以调用,没有最近的一个调度时间的概念。

这里面涉及到一个时间基准的概念:base_time,由于下面这段代码是反复执行来校验当前时间是否满足调度条件的,那么,base_time 就会被反复刷新,那么当时间真正的到达最近一个调度时间的时候,cron.get_next(datetime),也会基于当前的时间基准自动切换到下一个调度窗口了,而不是当前时间,所以始终就无法调度成功。

cron.get_prev 语义上是获取上一个调度时间,但是当 base_time 真正到达预期调度时间的时候,其实cron.get_prev获取到的就是当前的调度时间(忽略秒,毫秒),以为当前时间已经过去;再去做匹配的时候,时间就能吻合,就能激活调度


        # 拿到crontab的语法字符串
        cron_expr = spider.cron_job
        base_time = datetime.now()
        # 解析成为datatime对象
        cron
        # 校验当前时间是否匹配上了定时的时间规则
        now = datetime.now()
        # 获取最近的执行时间
        # (当时间刚好到达预期的调度时间的时候,
        # previous_run值将会刷新为当前的调度时间;
        # 如果没有到达目标的执行时间的时候,
        # previous_run始终得到的是上一次调度的时间)
        # base_time 刚刚到达目标调度时间的时候,那么previous_run也会刷新为该时间,此时时间上吻合,即可激活调度
        previous_run = cron.get_prev(datetime)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)