前言
我们在工作过程中,可能会遇到有定时任务的需求。大部分定时任务偏向 数据采集、消息提醒、邮件自动发送、数据指标统计
等场景。
比如:定时执行任务。每天早上 8 点定时推送日报。又或者:每一个周期执行一次任务。每周统计一次运营平台数据,形成趋势图,等等,这样的场景有很多。
今天,小编就跟大家分享下 Python 定时任务的实现方法。
正文
Python 内置方法sleep()
、threading.Timer
、sched
等也可实现定时任务的功能,但是都不怎么完美,太耗CPU资源了。因此,需要一个全能的任务调度库。它就是 APScheduler。
1 APScheduler 简介
APScheduler
的全称是 Advanced Python Scheduler
。它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔
,固定时间点(日期)
,Linux 下的 Crontab 命令
。同时,它还支持异步执行、后台执行调度任务。
2 安装
使用 pip 包管理工具安装 APScheduler 是最方便快捷的。
pip install APScheduler
3 使用步骤
APScheduler 使用起来还算是比较简单。运行一个调度任务只需要以下三部曲。
- 新建一个 schedulers (调度器)
- 添加一个调度任务(job stores)
- 运行调度任务
下面是执行每 2 秒报时的简单示例代码:
4 基础组件
APScheduler 有四种组件:
调度器(Scheduler)
作业存储(Job Store)
触发器(Trigger)
执行器(Executor)
schedulers(调度器)
它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。
它提供 7 种调度器,能够满足我们各种场景的需要。(最常用的是前3种)
- BlockingScheduler : 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。
- BackgroundScheduler : 调度器在后台线程中运行,不会阻塞当前线程。
- AsyncIOScheduler : 结合
asyncio
模块(一个异步框架)一起使用。 - GeventScheduler : 程序中使用
gevent
(高性能的Python并发框架)作为IO模型,和GeventExecutor
配合使用。 - TornadoScheduler : 程序中使用
Tornado
(一个web框架)的IO模型,用ioloop.add_timeout
完成定时唤醒。 - TwistedScheduler : 配合
TwistedExecutor
,用reactor.callLater
完成定时唤醒。 - QtScheduler : 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。
Triggers(触发器)
描述调度任务被触发的条件。不过触发器完全是无状态的。
APScheduler 有三种内建的 trigger:
1)date 触发器
date 是最基本的一种调度,作业任务只会执行一次。它表示特定的时间点触发。它的参数如下:
参数 | 说明 |
run_date (datetime 或 str) | 作业的运行日期或时间 |
timezone (datetime.tzinfo 或 str) | 指定时区 |
使用示例如下:
2)interval 触发器
固定时间间隔触发。interval 间隔调度,参数如下:
参数 | 说明 |
weeks (int) | 间隔几周 |
days (int) | 间隔几天 |
hours (int) | 间隔几小时 |
minutes (int) | 间隔几分钟 |
seconds (int) | 间隔多少秒 |
start_date (datetime 或 str) | 开始日期 |
end_date (datetime 或 str) | 结束日期 |
timezone (datetime.tzinfo 或str) | 时区 |
interval 触发器使用示例如下:
3)cron 触发器
在特定时间周期性地触发,和Linux crontab格式兼容。它是功能最强大的触发器。
我们先了解 cron 参数:
参数 | 说明 |
year (int 或 str) | 年,4位数字 |
month (int 或 str) | 月 (范围1-12) |
day (int 或 str) | 日 (范围1-31 |
week (int 或 str) | 周 (范围1-53) |
day_of_week (int 或 str) | 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun) |
hour (int 或 str) | 时 (范围0-23) |
minute (int 或 str) | 分 (范围0-59) |
second (int 或 str) | 秒 (范围0-59) |
start_date (datetime 或 str) | 最早开始日期(包含) |
end_date (datetime 或 str) | 最晚结束时间(包含) |
timezone (datetime.tzinfo 或str) | 指定时区 |
使用示例如下:
Job Stores(作业存储器)
任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。
Executors(执行器)
负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
执行器顾名思义是执行调度任务的模块。最常用的 executor 有两种:ProcessPoolExecutor
和 ThreadPoolExecutor
5 总结
APScheduler为Python开发者提供了一个强大的定时任务调度框架,使得在Python中实现定时任务变得非常简单和高效。掌握APScheduler的使用将为我们的项目和程序带来很大的便利。
而且在WEB应用中也非常广泛。如果你想在 Django 中运行,可以考虑django_apscheduler,推荐使用自定义命令,在一个单独的专用进程中执行单个定时任务。而如果你想在 Flask 中使用 APScheduler ,这里也有一个非官方的插件Flask-APScheduler。