运行 每个星期一都有一个 Python 调度程序?

Running a Python Scheduler every Monday?

我是 运行 每周一上午 10:00 的调度员。这是代码:

import schedule
import time

schedule.every().monday.at("10:00").do(job)

while 1:
    schedule.run_pending()
    time.sleep(1)

我的问题是 time.sleep() 的值应该是 7days = 604800 秒还是保持 1 秒? 有人可以提供一个很好的例子并说明 time.sleep() 如何影响程序的执行,在这种情况下哪种方式更好:睡眠 1 秒或 604800 秒。提前致谢。

schedule.run_pending() 简单地 运行s 所有到期的工作,连续循环。带有睡眠的循环决定检查作业的频率,定义作业何时为 运行.

的最小粒度

每秒轮询一次是不礼貌的。除非 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)