django-apscheduler 实现定时任务详解
安装
官方的 git 指引 点这里
pip install django-apscheduler
配置
在 setting.py 的 app 里面加入
INSTALLED_APPS = (
# ...
"django_apscheduler",
)
apscheduler 存在数据库依赖. migrate 一下
migrate
会在数据库中生成两行表
表结构在下面的使用中再说
使用
在任意的 view.py 中或者项目的 主 urls.py 中进行操作 (其他的暂时没试过, 不代表不行)
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job
@register_job(scheduler, "interval", minutes=2, id="test_func", replace_existing=True, misfire_grace_time=120)
def test_func():
views_tools.host_save()
scheduler.start()
简单的原理解释
注册后的任务会根据 id 以及相关的配置进行定时任务, 定时任务分为两种
1. 定时循环任务 (循环不断触发 比如每 20s 执行一次)
2. 定点执行任务 (只触发一次 比如 周一执行一次)
3. 定时定点循环任务 (比如 每周一执行一次)
任务的执行存在撞车的可能性, 即上一次任务没执行完, 下次任务就来了
此时下次任务会被错过 (missed) 上次任务不执行完. 下次任务永远都会错过
参数详解
schedul: 指定调度器
trigger: 'date'、'interval'、'cron'。
'date' + 'run_date' ---- 单次任务 @register_job(scheduler, 'date', id='test', run_date='2021-07-07 00:00:00')
'interval' + 'hours' + 'minutes' + ..... ------ 间隔性任务 @register_job(scheduler, 'interval', id='test', hours=3, minutes=30)
'cron' + 'hour' + 'minute'+... ----- cron类的任务 @register_job(scheduler, 'cron', id='test', hour=8, minute=30) 可选参数 day,second,month..
id: 任务的名字,不传的话会自动生成。不过为了之后对任务进行暂停、开启、删除等操作,建议给一个名字。并且是唯一的,如果多个任务取一个名字,之前的任务就会被覆盖。
args: list 执行代码所需要的参数。
replace_existing: 默认不设置的话回导致重启项目后, 爆id已存在的错误, 设置此参数后会对已有的 id 进行覆盖从而避免报错
next_run_time: datetime 开始执行时间
misfire_grace_time: 强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了
此参数在 官方的 git 中没有特别提及, 详解可以看这里 官方的详解
执行结果查看
在admin 里面查看也较为方便, 对 admin 进行了相应的封装方便过滤啥的, 以及状态清晰
django_apscheduler_djangojob 表保存注册的任务以及下次执行的时间
django_apscheduler_djangojobexecution 保存每次任务执行的时间和结果和任务状态
这里注意 missed 则是表示撞车的场景, 为避免这种场景需要在 周期的长度以及是否进行强制结束进行选择
其他问题
APScheduler 在 uwsgi 环境下会有存在复数个进程同时启用的问题, 从而重复执行占用资源
解决方式 这这这
本文来自博客园,作者:羊驼之歌,转载请注明原文链接:https://www.cnblogs.com/shijieli/p/15035357.html