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)

Playwright CLI Flags Tutorial

5 Playwright CLI Flags That Will Transform Your Testing Workflow

  • 0:56 --last-failed
  • 2:34 --only-changed
  • 4:27 --repeat-each
  • 5:15 --forbid-only
  • 5:51 --ui --headed --workers 1

Learn how these powerful command-line options can save you time, strengthen your test suite, and streamline your Playwright testing experience. Click on any timestamp above to jump directly to that section in the tutorial!

Watch Full Video 📹️

👋 Kindness is contagious

Please drop a ❤️ or a friendly comment on this post if it resonated with you!

Okay