TOP

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 环境下会有存在复数个进程同时启用的问题, 从而重复执行占用资源

解决方式  这这这

 

posted @ 2021-07-20 15:52  羊驼之歌  阅读(8394)  评论(0编辑  收藏  举报