猿问

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

我每周一上午 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 秒。提前致谢。


慕雪6442864
浏览 133回答 1
1回答

慕妹3242003

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

相关分类

Python
我要回答