为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2023-06-20 14:43:42
我每周一上午 10:00 运行调度程序。这是代码:import scheduleimport timeschedule.every().monday.at("10:00").do(job)while 1:    schedule.run_pending()    time.sleep(1)我的问题是 time.sleep() 的值应该是 7days = 604800 秒还是保持 1 秒?有人可以提供一个很好的例子并说明 time.sleep() 如何影响程序的执行,在这种情况下哪种方式更好:睡眠 1 秒或 604800 秒。提前致谢。
查看完整描述

1 回答

?
慕妹3242003

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)


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信