django 实现celery动态设置周期任务执行时间


Posted in Python onNovember 19, 2019

蓝鲸paas平台app开发经验分享

腾讯蓝鲸智云是一套基于PaaS的技术解决方案,提供了完善的前后台开发框架、调度引擎、公共组件等模块,帮助业务的产品和技术人员快速构建低成本、免运维的支撑工具和运营系统。

PaaS平台不仅将应用服务的运行和开发环境作为一种服务提供给开发者用户,更为开发者用户提供了高效便捷的开发服务,如:组件系统,统一登录,权限管理,后台框架,MagicBox,桌面/工作台等。

django 实现celery动态设置周期任务执行时间

PaaS平台提供支持多语言的开发框架,助力运维人员能基于平台之上以自己擅长的技术语言(Python、java等)开发运维自动化工具。

通过了解PaaS的设计理念,运维人员能够基于蓝鲸的PaaS平台,从零开始进行SaaS应用的实战开发,快速构建企业运维/运营系统,提升企业自动化水平。

开发背景

之前在一个银行自动化运维项目中,客户希望我们在蓝鲸PaaS上开发一个数据库巡检SaaS。具体需求如下:

为了保障数据库正常运行,保证数据的安全性、完整性和可用性,需要开发一个自动化巡检工具,代替原来的人工数据库巡检。并且巡检周期窗口分为日巡检、周巡检、月巡检、半年度巡检四类:

日巡检维护指每日按计划进行的巡检维护活动,以检查数据库运行状态、数据库备份状态和告警错误为主要内容。

周巡检维护指按一周为周期,在每周指定日按计划进行的巡检维护活动,它的工作内容是在日巡检维护工作内容的基础上添加数据库对象检查、安全性检查等内容组成。

月巡检维护指按一月为周期,在每月指定日按计划进行的巡检维护活动,它的工作内容是在周巡检维护工作内容的基础上添加系统参数配置检查、硬件与系统平台运行状态检查等内容组成。

年度巡检维护指按半年或者一年为周期,在指定日按计划进行的巡检维护活动,它的工作内容是在月巡检维护工作内容的基础上添加数据库性能诊断检查组成。

巡检实现方式分为两种:

1、立即巡检

用户首先选择某一业务下对应的目标主机,需要巡检的数据库实例(支持多选),设置数据采样区间(当前时间之前的任意时间段)。

django 实现celery动态设置周期任务执行时间

点击立即巡检按钮,等待数秒钟,巡检完成。点击查看详情,导出报告。

django 实现celery动态设置周期任务执行时间

2、定时巡检

用户可以根据需求设置每天、每周、每月来执行巡检任务。这里举例说明一下每周,用户首先需要配置某业务下面主机、数据库实例、巡检频率、巡检时长(任意天数)、执行时间(每周某一天的某时某分某秒),如下图:

django 实现celery动态设置周期任务执行时间

实现方式

针对以上需求,平时我们开发时使用periodic_task装饰器,程序启动后自动执行周期任务:

@periodic_task(run_every=crontab(minute='*/5', hour='*', day_of_week="*"))
def get_time():
  """
  celery 周期任务示例

  run_every=crontab(minute='*/5', hour='*', day_of_week="*"):每 5 分钟执行一次任务
  """
  now = datetime.datetime.now()
  logger.error(u"celery 周期任务调用成功,当前时间:{}".format(now))

crontab()实例化的时候没设置任何参数,都是使用默认值。crontab一共有7个参数,常用有5个参数分别为:

minute:分钟,范围0-59

hour:小时,范围0-23

day_of_week:星期几,范围0-6。以星期天为开始,即0为星期天。这个星期几还可以使用英文缩写表示,例如“sun”表示星期天

day_of_month:每月第几号,范围1-31

month_of_year:月份,范围1-12

以上方案有个弊端:

需要每次根据巡检是周几,来计算数据采样区间具体时间,然后触发定时任务,可能会存在误差。

定时任务无法直接取消

举例来说,假如客户选择每周三早上8点执行任务,采样区间为3天。假如首次10月1日8:00执行任务,触发定时任务获取9月28日8:00-10月1日8:00之间的数据;然后再次执行时间为10月8日,再次触发定时任务,循环执行。

最终,通过以下方式解决:

模板函数提前开发完成,加上@task()装饰器:

@task()
def auto_iip(**kwargs):
   logger.error(kwargs)
   '此处写逻辑代码'

测试每分钟执行一次,启动工程,启动celery,调用下面函数,OK,等待1分钟,sucess!

from djcelery.models import PeriodicTask, CrontabSchedule
from djcelery.schedulers import ModelEntry, DatabaseScheduler
def test_celery_task(date_data):
  crontab= CrontabSchedule.objects.create(
    hour='*',
    minute='*/1',
    day_of_week='*',
    day_of_month='*',
    month_of_year="*"
  )
  schedule = crontab.schedule

  create_or_update_task = DatabaseScheduler.create_or_update_task
  #'home_application.celery_tasks.auto_iip' home模块下的task。
  task_template='home_application.celery_tasks.auto_iip'
  #task_name自定义,不能重复。
  task_name = 'test'
  schedule_dict = {
    'schedule': schedule,
    'args': [],
    'kwargs': data,
    'task': task_template,
    'enabled': 1
  }
  create_or_update_task(task_name, **schedule_dict)

定时任务停止,直接根据task_name进行删除

def delete_celery_task(task_name):
  DatabaseScheduler.delete_task(task_name)

ok!大功告成。

以上这篇django 实现celery动态设置周期任务执行时间就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用Django实现博客系统完整版
Sep 29 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python学生管理系统学习笔记
Mar 19 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python多线程http压力测试脚本
Jun 25 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
django中related_name的用法说明
May 20 Python
教你漂亮打印Pandas DataFrames和Series
May 29 Python
python调用接口的4种方式代码实例
Nov 19 #Python
Python Django2.0集成Celery4.1教程
Nov 19 #Python
通过celery异步处理一个查询任务的完整代码
Nov 19 #Python
Django 自动生成api接口文档教程
Nov 19 #Python
wxpython实现按钮切换界面的方法
Nov 19 #Python
Python性能分析工具Profile使用实例
Nov 19 #Python
使用apiDoc实现python接口文档编写
Nov 19 #Python
You might like
jQuery插件 tabBox实现代码
2010/02/09 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
布同自制Python函数帮助查询小工具
2011/03/13 Python
Python 抓取动态网页内容方案详解
2014/12/25 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python多线程爬虫简单示例
2016/03/04 Python
python非递归全排列实现方法
2017/04/10 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
python实现简易数码时钟
2021/02/19 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
安全责任协议书
2014/04/21 职场文书
自我工作评价范文
2015/03/06 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
工作收入证明模板
2015/06/12 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
新手入门Mysql--概念
2021/06/18 MySQL