- 想实现的事拿当前时间和最近的一个调度时间做对比,但是
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)
Top comments (0)