APScheduler+MySQL实现定时任务及其持久化存储
APScheduler+MySQL实现定时任务及其持久化存储
转自:APScheduler+MySQL实现定时任务及其持久化存储 - 简书 (jianshu.com)
最近,想要实现一个功能,就是添加定时任务的同时记录其任务信息到数据库中,可以通过接口查看设定了哪些定时任务,经过调研,发现大家公认的Python最好用的定时任务框架是APScheduler。
Python Scheduler(APScheduler)是一个Python库,它允许您安排稍后要执行的Python代码,只需一次或定期执行。 您可以在您的同时添加新的作业或删除旧的旧作业。 如果在数据库中存储工作,他们还将存活调度程序重新启动并保持状态。 调度程序重新启动时,它将运行它在脱机时应该运行的所有作业
在网上找了一堆资料,包括官方教程,但对于和MySQL协作使用的方面语焉不详,因此,这里做个记录。
项目使用的环境如下:
- Python 3.7
- MySQL
- APScheduler
- Navicat for MySQL
APScheduler Startup
首先,安装APScheduler:
然后就可以编写简单的demo了:
这个demo表示每周的星期一到星期五的六点半报时
APScheduler基础教程
具体见大佬2的博客,这里不做赘述
这里总结一下常用的任务模式。
interval间隔时间任务
即每隔一段时间执行一次,可能的字段为:
字段 | 值类型 | 说明 |
---|---|---|
weeks | int | number of weeks to wait |
days | int | number of days to wait |
hours | int | number of hours to wait |
minutes | int | number of minutes to wait |
seconds | int | number of seconds to wait |
start_date | datetime/str | starting point for the interval calculation |
end_date | datetime/str | latest possible date/time to trigger on |
timezone | datetime.tzinfo/str | time zone to use for the date/time calculations |
例子:
date定点任务
即在某个时刻运行,但仅执行一次,可能的字段为:
字段 | 值类型 | 说明 |
---|---|---|
run_date | datetime/str | the date/time to run the job at -(任务开始的时间) |
timezone | datetime.tzinfo/str | time zone for run_date if it doesn’t have one already |
栗子:
cron某一时刻任务
可能的字段为:
字段 | 值类型 | 值 | 说明 |
---|---|---|---|
year | int/str | XXXX | 表示四位数的年份,如2008年 |
month | int/str | 1-12 | 表示取值范围为1-12月 |
day | int/str | 1-31 | 表示取值范围为1-31日 |
week | int/str | 1-53 | 格里历2006年12月31日可以写成2006年-W52-7 扩展形式或2006W527 紧凑形式 |
day_of_week | int/str | 0-6 或 mon,tue,wed,thu,fri,sat,sun | 表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示 |
hour | int/str | 0-23 | 表示取值范围为0-23时 |
minute | int/str | 0-59 | 表示取值范围为0-59分 |
second | int/str | 0-59 | 表示取值范围为0-59秒 |
start_date | datetime/str | XXXX-XX-XX hh:mm:ss | 表示开始时间 |
end_date | datetime/str | XXXX-XX-XX hh:mm:ss | 表示结束时间 |
timezone | datetime.tzinfo/str | time zone to use for the date/time calculations | 表示时区取值 |
其中,int/str
表示参数既可以是int类型,也可以是str类型;datetime/str
表示参数既可以是datetime类型,也可以是str类型
例子:
APScheduler + MySQL
不过我们肯定并不满足于实现一个小小的demo。
如果我们想要连接MySQL
实现持久化存储应该怎么做呢?
这里需要配置调度器:
其中,apscheduler.jobstores.default
字段表示存储器的配置,字段说明如下:
-
type
表示数据库的类型,MySQL
属于SQLAlchemy
,因此这里值填写sqlalchemy
-
表示存储器访问呢的地址,其中的这些字段需要配置:
username
为你的数据库的用户名password
为对应的账号的密码dbname
为数据库名称
-
tablename
表示将定时任务数据存储的表名
然后就可以使用配置好的scheduler
添加任务了:
其中id
表示任务的唯一标识符,coalesce
表示忽略服务器宕机时间段内的任务执行(否则就会出现服务器恢复之后一下子执行多次任务的情况),replace_existing
表示如果有重名的任务,直接覆盖
添加任务后就可以看到数据库多出了内容:

添加任务后的数据库
这里使用了中文字符串作为id,可以语义地表示任务
然鹅,要想任务存储其他信息怎么办,这里思来想去,决定在数据库创建一个新的表,用于记录任务的详细信息,方便后续查看,每次添加任务时往该表插值即可,删除任务时也删除对应的数据,由此实现任务数据的同步。
不过需要注意的是,在添加重复名称的定时任务时,设置replace_existing=True
,直接覆盖已有的任务;相应地,在对其任务信息表,我们采用REPLACE
替代INSERT
语句来执行插入操作,其使用方法和INSERT
完全一样,但如果表中有重复的数据,则会直接覆盖,其优势不言而喻。由此,实现了协同操作。
其数字孪生任务信息表的字段可为:

定时任务详情表
作者:走错说爱你
链接:https://www.jianshu.com/p/e36236c1df08
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
__EOF__

本文链接:https://www.cnblogs.com/starkzz/p/17498080.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!