1. 介绍 schedule 库
在这节课里,我们就像一台精准的时钟,学习如何设置代码按照时间表来运行,让我们的代码在我们想要的时候启动。准备好了吗?今天我们要征服时间!
schedule
是一个轻量化的模块,可以按照指定的时间表运行函数。如果你的代码需要在特定时间执行,比如每天早上 6 点收集数据,或者发送每日提醒,那么 schedule
就是你需要的。
以下是 schedule
的主要优点:
- 简单:直观的界面,比标准的
cron
或threading
方法更易使用。 - 轻便:只有必要的功能,没有多余的东西。
- 清晰:几乎像自然语言一样设置时间表。
安装库
开始之前,我们需要安装 schedule
库。像大多数 Python 库一样,使用 pip
:
pip install schedule
好了,现在一切就绪,让我们进入自动化的世界,看看 schedule
如何改变你的日常工作。
schedule
库的主要方法
schedule
提供了多种设置任务时间和执行频率的方法:
every().day.at("HH:MM")
— 每天特定时间执行任务。every().hour
— 每小时执行一次任务。every().minute
— 每分钟执行一次任务。every().week.at("HH:MM")
— 每周特定时间执行任务。every().monday.at("HH:MM")
— 每周一的特定时间运行任务。every(10).seconds
— 每 10 秒(或任意时间间隔)执行一次任务。
2. 设置重复任务
让我们从简单的例子开始——计划一个每小时运行的函数。我们会创建一个简单的函数,输出一条问候语,并按照时间表运行它。
例子:每小时问候一次
import schedule
import time
def say_hello():
print("你好!我们正在搞钟表式自动化。")
# 每小时触发一次 say_hello 函数
schedule.every().hour.do(say_hello)
while True:
# 触发所有到时间的任务
schedule.run_pending()
time.sleep(1)
这就是你的第一个 schedule
脚本了!在这个例子中,我们用 every().hour.do(say_hello)
方法,每小时问候一次“你好!”。惊讶吧?
命令 schedule.every().hour.do(say_hello)
并不会直接执行函数 say_hello
,而是将它的调用加入时间表。在合适的时间,通过 schedule.run_pending()
调用,会真正触发函数运行。
3. 设置更复杂的间隔
如果我们想要定时任务不仅仅是每小时启动,比如每 10 分钟运行一次或者在特定的星期几运行怎么办?schedule
支持大多数常见的时间表达式,你可以轻松使用它们。
例子:每 10 分钟运行一次任务
import schedule
import time
def task():
print("这个任务每 10 分钟运行一次。")
# 计划任务每 10 分钟运行一次
schedule.every(10).minutes.do(task)
while True:
schedule.run_pending() # 触发所有到时间的任务
time.sleep(1)
例子:特定星期的任务
现在我们尝试计划一个任务,每周一和周三的早上 9 点运行。
import schedule
import time
def monday_wednesday_task():
print("这个任务在每周一和周三的早上 9 点运行。")
# 周一和周三早上 9 点运行任务
schedule.every().monday.at("09:00").do(monday_wednesday_task)
schedule.every().wednesday.at("09:00").do(monday_wednesday_task)
while True:
schedule.run_pending()
time.sleep(1)
可以看到,schedule
支持多种时间表达式,包括星期几和精确时间启动。这对同步你的工作或者计划好的事件非常方便。
4. 处理不同时间条件的任务
如果你的脚本有多个任务,每个任务有自己的时间表,schedule
能轻松解决这个问题。例如,一个任务每天早上运行,另一个则在周五运行。
例子:在同一个脚本中结合不同任务
import schedule
import time
def morning_task():
print("早上好!现在是早晨任务时间。")
def friday_task():
print("周五来了!现在是周五任务时间。")
# 每天早上 7:30 的任务
schedule.every().day.at("07:30").do(morning_task)
# 每周五下午 16:00 的任务
schedule.every().friday.at("16:00").do(friday_task)
while True:
schedule.run_pending()
time.sleep(1)
实用建议和常见错误
使用 schedule
自动化任务时,有一些点需要注意。
首先,记住 schedule
在主线程中运行。这意味着如果你的任务耗时较长,或者可能阻塞其他任务运行,建议使用多线程或异步调用。
其次,如果任务必须在严格的时间运行,请确保你的设备是开着的,脚本正在运行。如果脚本停止或者设备关机,schedule
不会工作。
最后一个常见误解是预期 schedule
能补上错过的任务。遗憾的是,如果任务在预定时间未运行,schedule
不会补偿这些错过的任务。
GO TO FULL VERSION