1 回答
TA贡献1824条经验 获得超6个赞
schedule.run_pending()简单地循环运行所有到期的作业。带有睡眠的循环决定检查作业的频率,定义作业何时运行的最小粒度。
每秒轮询一次是不礼貌的。除非 CPU 无论如何都是空闲的,否则每次轮询都会中断一些其他任务,刷新内存缓存并通常增加宇宙的熵。您可以通过更改睡眠来设置不同的粒度。在此示例中,作业每 10 分钟检查一次。所以它可能在 10:10 而不是 10:00 运行。这可能很好,而且您中断系统的次数减少了 600 次。每小时轮询一次对于您的任务也可能是合理的。
JOB_GRANULARITY_SECONDS = 60 * 10
while True:
schedule.run_pending()
time.sleep(JOB_GRANULARITY_SECONDS)
但是当工作之间有很大的差距时,为什么不直接计算出确切的睡觉时间呢?您可以获得下一份工作的时间并睡那么多时间(也许有一个软糖因素来处理微小的波动,例如时钟的粒度和时间协议在一些额外时间中的折腾)。此示例具有 2 秒的捏造粒度。
while True:
schedule.run_pending()
next_run_delta = (schedule.next_run - datetime.datetime.now()).total_seconds()
if next_run_delta <= 0:
continue
time.sleep(next_run_delta + 2)
您还可以添加异常处理,以应对一切都崩溃的情况
while True:
try:
schedule.run_pending()
except Exception as e:
my_alert_fctn(f"Scheduler failed, {e}") # email maybe?
next_run_delta = (schedule.next_run - datetime.datetime.now()).total_seconds()
if next_run_delta < 0:
continue
time.sleep(next_run_delta + 2)
添加回答
举报