首页 > 其他分享 >Django高级特性:django-apscheduler定时任务

Django高级特性:django-apscheduler定时任务

时间:2023-12-07 11:45:15浏览次数:28  
标签:str 任务 Django apscheduler job scheduler date django

 

前言:

在使用Django框架开发web项目时,很多时候需要设置定时任务或让用户手动在页面上设置定时任务
在Django中实现定时任务功能大概有以下三种方法:

  • Celery
    分布式任务队列。侧重实时操作,可用于生产系统处理数以百万计的任务,都用于大型项目,配置和使用较为复杂。由于它本身不支持消息存储服务,所以需要第三方消息服务来传递任务,一般使用Redis。
  • django-crontab
    只需要下载一个django-crontab包就可以使用cron表达式在Django框架中设置定时任务。这种方法不支持windows系统,功能也相对简单。
  • django-apscheduler
    支持三种调度任务:固定时间间隔,固定时间点(日期),Crontab 命令。同时,它还支持异步执行、后台执行调度任务 配置简单、功能齐全、使用灵活、支持windows和linux,适合中小型项目。
 

安装模块

pip3 install django-apscheduler

 

配置

同步数据库,然后在INSTALLED_APPS中加入django-apscheduler应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_apscheduler',
    'UserManger.apps.UsermangerConfig',
]

去数据库中看一看,生成了两个表格,大部分都顾名思义。

1. django_apscheduler_djangojob

用于存储任务的表格

2. django_apscheduler_djangojobexecution

用于存储任务执行状态的表格

 

创建任务

有两种创建任务的方法:装饰器和add_job函数。

下面是简单的例子:

import time
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events

print('django-apscheduler')

def job2(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name,time.strftime("%Y-%m-%d %H:%M:%S")))

# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")
# 添加任务1
# 每隔5s执行这个任务
@register_job(scheduler,"interval", seconds=5,args=['王路'],id='job1')
def job1(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name,time.strftime("%Y-%m-%d %H:%M:%S")))

scheduler.add_job(job2,"interval",seconds=10,args=['王飞'],id="job2")

# 监控任务
register_events(scheduler)
# 调度器开始运行
scheduler.start()
 

基础组件

APScheduler 有四种组件,分别是:调度器(scheduler),作业存储(job store),触发器(trigger),执行器(executor)。

  • schedulers(调度器)
    它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。
  • triggers(触发器)
    描述调度任务被触发的条件。不过触发器完全是无状态的。
  • job stores(作业存储器)
    任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中。
  • executors(执行器)
    负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
 

schedulers(调度器)

它提供 7 种调度器,能够满足我们各种场景的需要。例如:后台执行某个操作,异步执行操作等。调度器分别是:

  • BlockingScheduler : 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。
  • BackgroundScheduler : 调度器在后台线程中运行,不会阻塞当前线程。(Django框架使用)
  • AsyncIOScheduler : 结合 asyncio 模块(一个异步框架)一起使用。
  • GeventScheduler : 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 GeventExecutor 配合使用。
  • TornadoScheduler : 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。
  • TwistedScheduler : 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。scrapy爬虫框架
  • QtScheduler : 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。
 

triggers(触发器)

它提供 3种内建的 trigger

  • date 触发器 作业任务只会执行一次。它表示特定的时间点触发。它的参数如下:
参数说明
run_date (datetime 或 str) 作业的运行日期或时间
timezone (datetime.tzinfo 或 str) 指定时区
# 在 2017-12-13 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=date(2017, 12, 13), args=['text'])
# 在 2017-12-13 14:00:00 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text'])
# 在 2020-12-13 14:00:01 时刻运行一次 job_func 方法
scheduler.add_job(job3,"date",run_date='2020-12-13 14:00:01',args=['王飞'],id="job3")
  • interval 触发器 固定时间间隔触发。interval 间隔调度,参数如下:
参数说明
weeks (int) 间隔几周
days (int) 间隔几天
hours (int) 间隔几小时
minutes (int) 间隔几分钟
seconds (int) 间隔多少秒
start_date (datetime 或 str) 开始日期
end_date (datetime 或 str) 结束日期
timezone (datetime.tzinfo 或str) 时区
# 每隔两分钟执行一次 job_func 方法
scheduler .add_job(job_func, 'interval', minutes=2)
# 在 2017-12-13 14:00:01 ~ 2017-12-13 14:00:10 之间, 每隔两分钟执行一次 job_func 方法
scheduler .add_job(job_func, 'interval', minutes=2, start_date='2017-12-13 14:00:01' , end_date='2017-12-13 14:00:10')
  • cron 触发器 在特定时间周期性地触发,和Linux crontab格式兼容。
参数说明
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) 指定时区

这些参数是支持算数表达式,取值格式有如下:

图1.png图1.png

# 在每天的2点35分36分37分 执行 job_func 任务
scheduler.add_job(job4,"cron",hour='2', minute='35-37',args=['王涛'],id="job4")
 

作业存储(job store)

有两种添加方法,其中一种是 add_job(), 另一种则是@register_job()修饰器来修饰函数。

这个两种办法的区别是:第一种方法返回一个 Job 的实例,可以用来改变或者移除 job。第二种方法只适用于应用运行期间不会改变的 job。

django-apscheduler框架还提供了很多操作定时任务的函数。比如:

  • 删除任务
    scheduler.remove_job(job_name)
  • 暂停任务
    scheduler.pause_job(job_name)
  • 开启任务
    scheduler.resume_job(job_name)
  • 获取所有任务
    scheduler.get_jobs()
  • 修改任务
    scheduler.modify_job(job_name)

注:修改任务只能修改参数,如果要修改执行时间的话,有3种方法
第一就把任务删了重新创建,
第二直接操作数据库,
第三用到下面重设任务。

  • 重设任务
    scheduler.reschedule_job(job_name)

scheduler.reschedule_job(job_id="job1", trigger='interval', minutes=1)

 

执行器(executor)

执行调度任务的模块。最常用的 executor 是 ThreadPoolExecutor,存储路径是在Django数据库中

 

总结

django-apscheduler使用起来十分方便。提供了基于日期、固定时间间隔以及crontab 类型的任务,我们可以在主程序的运行过程中快速增加新作业或删除旧作业,并且作业会存储在数据库中,当调度器重启时,不必重新添加作业,作业会恢复原状态继续执行。django-apscheduler可以当作一个跨平台的调度工具来使用,可以做为 linux 系统crontab 工具或 windows 计划任务程序的替换。需要注意的是,apscheduler不是一个守护进程或服务,它自身不带有任何命令行工具。它主要是要在现有的应用程序中运行。

转载于:https://www.xkblogs.com/index.php/archives/26/

标签:str,任务,Django,apscheduler,job,scheduler,date,django
From: https://www.cnblogs.com/thankcat/p/17881353.html

相关文章

  • Django ORM 多表操作:一对一、一对多、多对多的增删改查 (二)
    DjangomodelORM数据表相关操作分析思路,创建数据表对于表操作,表之间的关联关系,必须理解他们之间的关系,对于编程很重要。可以看看映射关系、外键和relationship查询,至少明白外键相关基本知识。下面是简单的demo1.创建数据模型models.py文件,fromdjango.dbimportmodels#Cre......
  • Django开发中csrf 的作用和含义以及用法
    在Django中,CSRF指的是跨站请求伪造(Cross-SiteRequestForgery)。这是一种网络入侵方法,入侵者诱使已认证的用户在他们不知情的情况下发送伪造的请求,比如在用户登录某个受信任网站后,在另一个标签页中访问恶意网站,恶意网站上的脚本可以发送请求到受信任网站,而这个请求会携带用户的......
  • DjangoORM语法
    ORM语法-配置django中与数据库映射的关系,不需要写原始sql语句,而是定义模型类,操作模型完成对数据库进行增删改查等操作。o指类对象的意思r指数据库表的意思m指映射的意思orm的优点数据库模型定义在一个地方,方便维护orm有现成的工具,很多功能自动完成,比如数据库消除,预处......
  • django02
    django小白必会三板斧#启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py#django自带重启功能当识别到项目中代码有变化之后隔段时间会自动重启但是有时候较慢#与浏览器打交道的视图函数都应该有返回值常见......
  • Django中ForeignKey函数详解
    在Django中,ForeignKey是一个数据库模型字段,用于创建多对一(many-to-one)的关系。它实质上是数据库表之间的一个链接,指向另一个模型的实例。在Django的ORM(对象关系映射)系统中,ForeignKey字段非常重要,因为它允许模型间的数据关联和交互。基本用法在Django模型中定义ForeignKey......
  • 解决vue-django配置问题
    后端跨域问题django安装pipinstalldjango-cors-headers添加应用,主应用下的settingINSTALLED_APPS=[...#跨域'corsheaders',...]中间件设置MIDDLEWARE=[...#跨域中间键设置'corsheaders.middleware.CorsMiddleware', ...]添加黑白名单(se......
  • django BaseCommand
    使用命令行执行脚本fromdjango.core.management.baseimportBaseCommandfromdjango.dbimporttransactionfromapps.db.modelsimportAdminMenuclassCommand(BaseCommand):help='管理端、PC端、H5端菜单'defadd_arguments(self,parser):pars......
  • Django学习(二) 之 模板的使用
    写在前面昨晚应该是睡的最好一天吧,最近一个月睡眠好差,睡不着不说,而且半夜总醒,搞的我第二天就会超没精神。昨天下午去姐姐家,我刚进屋,小外甥直接就问我说:老舅,你都很长时间没来啦,**(前女友)哪去了,我们都好久没出溜溜了!我顿了下说,她不喜欢我们了,等以后天暖和,我们再去溜溜。......
  • Django和sqlite3版本不匹配解决 Django-django.core.exceptions.ImproperlyConfigured
    1.修改django源文件配置2升级sqlite下载sqlite3wgethttps://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz 解压并安装sqlite3tar-zxvfsqlite-autoconf-3270200.tar.gzcdsqlite-autoconf-3270200./configure--prefix=/usr/localmake&&makeinstall......
  • django框架01
    纯手撸web框架"""web框架:将前端数据库整合到一起基于互联网传输的python代码web框架也可以简单的理解为是软件开发架构里面的'服务端'"""#1.搭建简易版本服务端socket模块#2.遵循HTTP协议四大特性/数据格式/响应状态码#3.基于不同的后缀响应不同的内容如何获取......