• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共43篇

    python3.X - Web - Django3.2.9

关闭

返回栏目

关闭

返回python3.X - Web - Django3.2.9栏目

34 - 扩展 - 定时任务 - django-apscheduler - @register_job

作者:

贺及楼

成为作者

更新日期:2024-06-13 21:09:55

django-apscheduler

定时任务django-apscheduler使用教程

系统 支持
Linux
Windows
触发器 中文 释义
interval 固定时间间隔 当您要以固定的时间间隔运行作业时使用
date 固定时间点(日期) 在您希望在某个特定时间仅运行一次作业时使用
cron Crontab 命令 以crontab的方式运行定时任务

场景

redis持久化存储时,使用APScheduler,使数据同步。
用户下单后使用,规定30min内必须支付,否则取消订单。

优点

可以独立运行,也可以放在程序(如Django、Flask)中。
灵活,可以在程序开始前开启定时任务,也可以执行到某个任务时,立即可开启定时任务。(下单30min后取消)
如果依赖程序的话,会占用程序资源;

定时任务django-apscheduler安装

  1. pip install django-apscheduler
  2. 或者
  3. pip install apscheduler

离线安装顺序

  1. 复制,tab键补全版本
  2. pip install zipp
  3. ## pip install importlib-resources 包名,装下面的下划线
  4. pip install importlib_resources
  5. pip install backports.zoneinfo
  6. pip install tzdata
  7. pip install pytz_deprecation_shim-
  8. ## pip install importlib-metadata 包名,装下面的下划线
  9. pip install importlib_metadata
  10. pip install tzlocal
  11. pip install APScheduler
  12. ## pip install django-apscheduler 包名,装下面的下划线
  13. pip install django_apscheduler

settings.py 注册

  1. INSTALLED_APPS = [
  2. ...
  3. 'django_apscheduler', # 新加入的定时任务插件django-apscheduler
  4. ]

python manage.py migrate 生成2个表格

  1. django_apscheduler_djangojob——用于存储任务的表格
  2. django_apscheduler_djangojobexecution——用于存储任务执行状态的表格

代码 只能在view.py写

  1. import time
  2. from apscheduler.schedulers.background import BackgroundScheduler
  3. from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events
  4. print('django-apscheduler')
  5. ## 实例化调度器
  6. scheduler = BackgroundScheduler()
  7. ## 调度器使用DjangoJobStore()
  8. scheduler.add_jobstore(DjangoJobStore(), "default")
  9. ## 添加任务1
  10. ## 每隔5s执行这个任务
  11. @register_job(scheduler,"interval", seconds=5,args=['王路'],id='job1', replace_existing = True)
  12. ## 每天8点半执行这个任务
  13. ## @register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'], replace_existing = True)
  14. def job1(name):
  15. # 具体要执行的代码
  16. print('{} 任务运行成功!{}'.format(name,time.strftime("%Y-%m-%d %H:%M:%S")))
  17. ## 监控任务——注册定时任务
  18. register_events(scheduler)
  19. ## 调度器开始运行
  20. scheduler.start()
  1. replace_existing = True
  2. 这个参数解决第二次启动失败的问题
  3. 'Job identifier (job1) conflicts with an existing job'

参数

序号 参数名 参数释义 例子 注释
1 scheduler 指定调度器
2 trigger 任务执行的方式,共有三种: “date”、”interval”、”cron”。
2.1 “date” + “run_date” 的参数组合, 能实现单次任务。 例子: 2019-07-07 22:49:00 执行任务@register_job(scheduler, "date", id="test", run_date="2019-07-07 22:49:00") 注:在亲测时,执行完任务会报错,原因时执行完任务后会去mysql中删除djangojob表中的任务。但是djangojobexecution表记录着执行结果,有外键关联着djangojob表,所以删除时显示有外键约束错误。但是任务会正常执行,执行之后也会正常删除。
2.2 “interval” + “hours” + “minutes” + … 的参数组合,能实现间隔性任务。 例子:每隔3个半小时执行任务@register_job(scheduler, "interval", id="test", hours=3, minutes=30)还有seconds,days参数可以选择 注:如果任务需要执行10秒,而间隔设置为1秒,它是不会给你开10个线程同时去执行10个任务的。它会错过其他任务直到当前任务完成。
2.3 “cron” + “hour” + “minute”+…的参数组合,能实现cron类的任务。 例子:每天的8点半执行任务@register_job(scheduler, "cron", id="test", hour=8, minute=30)还有day,second,month等参数可以选择。
3 id 任务的名字,不传的话会自动生成。不过为了之后对任务进行暂停、开启、删除等操作,建议给一个名字。并且是唯一的,如果多个任务取一个名字,之前的任务就会被覆盖。
4 args list类型。执行代码所需要的参数。
5 next_run_time datetime类型。开始执行时间。如果你现在创建一个定时任务,想3天后凌晨三点半自动给你女朋友发微信,那就需要这个参数了。

定时任务django-apscheduler启动

  1. python manage.py runserver

Django启动,就启动

定时任务django-apscheduler组件

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

序号 器名 参数释义/ 注释
1/4 schedulers(调度器) 它是任务调度器,属于控制器角色。 它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。
1.1 BlockingScheduler 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。
1.2 BackgroundScheduler 调度器在后台线程中运行,不会阻塞当前线程。(Django框架使用)
1.3 AsyncIOScheduler 结合 asyncio 模块(一个异步框架)一起使用。
1.4 GeventScheduler 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 - GeventExecutor 配合使用。
1.5 TornadoScheduler 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。
1.6 TwistedScheduler 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。scrapy爬虫框架
1.7 QtScheduler 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。
2/4 triggers(触发器) 描述调度任务被触发的条件。 不过触发器完全是无状态的。
2.1 date 时间
2.1.1 run_date (datetime 或 str)作业的运行日期或时间
2.1.2 timezone (datetime.tzinfo 或 str)指定时区
下方有示例
2.2 interval 定时
2.2.1 weeks (int)间隔几周
2.2.2 days (int)间隔几天
2.2.3 hours (int)间隔几小时
2.2.4 minutes (int)间隔几分钟
2.2.5 seconds (int)间隔多少秒
2.2.6 start_date (datetime 或 str)开始日期
2.2.7 end_date (datetime 或 str)结束日期
2.2.8 timezone (datetime.tzinfo 或str)时区
2.3 cron 定时
2.3.1 year (int 或 str)年,4位数字
2.3.2 month (int 或 str)月 (范围1-12)
2.3.3 day (int 或 str)日 (范围1-31
2.3.4 week (int 或 str)周 (范围1-53)
2.3.5 day_of_week (int 或 str)周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun)
2.3.6 hour (int 或 str)时 (范围0-23)
2.3.7 minute (int 或 str)分 (范围0-59)
2.3.8 second (int 或 str)秒 (范围0-59)
2.3.9 start_date (datetime 或 str)最早开始日期(包含)
2.3.10 end_date (datetime 或 str)最晚结束时间(包含)
2.3.11 timezone (datetime.tzinfo 或str)指定时区
3/4 job stores(作业存储器) 任务持久化仓库 默认保存任务在内存中,也可将任务保存到各种数据库中。
4/4 executors(执行器) 负责处理作业的运行 它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。

定时任务django-apscheduler运行时间date

  1. ## 在 2017-12-13 时刻运行一次 job_func 方法
  2. scheduler .add_job(job_func, 'date', run_date=date(2017, 12, 13), args=['text'])
  3. ## 在 2017-12-13 14:00:00 时刻运行一次 job_func 方法
  4. scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text'])
  5. ## 在 2020-12-13 14:00:01 时刻运行一次 job_func 方法
  6. scheduler.add_job(job3,"date",run_date='2020-12-13 14:00:01',args=['王飞'],id="job3")
  7. ## 如果date后面没有参数的话,就是立刻执行代码,一般测试的时候用
  8. app.scheduler.add_job(函数名, "date", args=[app])