定时任务调度

简介

Schedule,是 Github 上 dbader 开源的 Python 定时任务调度库,目前版本为 0.6.0,代码仓库地址为 https://github.com/dbader/schedule。受到 Adam Wiggins 的文章《Rethinking Cron》和 Ruby 的 clockwork 模块的启发,schedule 使用了一种对开发者友好的定时任务设置 API,十分人性化。Schedule 非常轻量,没有外部依赖,测试覆盖率高(可达100%),是个优秀的 Python 三方库。

Python Schedule

安装

Schedule 目前支持 Python2.7 和 Python3.5 以上,使用 pip 安装:

pip install schedule

示例

Schedule 的使用十分简单,以下是一个基本使用的例子:

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)  # 每十分钟
schedule.every().hour.do(job)  # 每小时
schedule.every().day.at("10:30").do(job)  # 每天10:30
schedule.every(5).to(10).minutes.do(job)   # 每5到10分钟(随机)
schedule.every().monday.do(job)  # 每周一
schedule.every().wednesday.at("13:15").do(job)  # 每周三13:15
schedule.every().minute.at(":17").do(job)  # 每分钟的17秒时

# 等待定时任务运行
while True:
    schedule.run_pending()
    time.sleep(1)

可以看到,schedule 的使用与自然语言(英语)很相似。

其主要使用 every 接口进行定时任务的配置,如 every(10).minutes 就是每十分钟,every().day 就是每天;另外,还使用了 at 接口进行确定时间点的设置,使用 to 接口进行随机时间间隔的配置。

在进行了定时任务关于时间间隔的定义后,利用 do 接口注册所需运行的实际任务,通常是一个函数,也可以是任意可调用的对象。do 接口也可以接受函数参数,从而实现带参数函数的调用:

def greet(name):
    print('Hello', name)

schedule.every(2).seconds.do(greet, name='Alice')
schedule.every(4).seconds.do(greet, name='Bob')

进阶

  • Schedule 主要的接口是类 Scheduler 和 Job,分别代表调度器和定时任务。当使用 every、at 等接口时,返回的是 Job 实例,定时任务的定义过程实际是一个链式调用,实现了多种设置的叠加。
  • Schedule 支持对于任务的标记,可以通过 tag 接口添加多个标签。
  • Schedule 支持对于定时任务的取消。cancel_job 接口可以取消一个 Job 实例;而 clear 接口则接受一个可选的标签参数,可以取消包含该标签的所有任务。
def greet(name):
    print('Hello {}'.format(name))

schedule.every().day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every().hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every().hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks', 'guest')

schedule.clear('daily-tasks')  # 取消所有包含标签daily-tasks的任务
  • 定时任务可以并发执行,需要使用 threading 等进行线程派生。
  • 可以使用 next_run 接口得到下一次运行的时间,idle_seconds 接口得到需要等待的时间,should_run 接口得知任务是否正在运行。

总结

Schedule 是一个对开发者友好的定时任务调度库,其 API 方便简洁,支持任务的标记和取消等,功能可以满足不同场景的需求。

Schedule 代码量不超过700行,没有额外依赖,十分轻量小巧;同时代码编码规范,文档清晰,并充分利用了链式调用范式,是一个值得学习的 Python 库。