运行 每个星期一都有一个 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)
我是 运行 每周一上午 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)