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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
mac下如何将python2.7改为python3
Jul 13 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
Pytorch之保存读取模型实例
Dec 30 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python 实现全球IP归属地查询工具
Dec 18 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
python中的3种定义类方法
Nov 27 Python
如何利用python实现列表嵌套字典取值
Jun 10 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
php 图像函数大举例(非原创)
2009/06/20 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php实现通过ftp上传文件
2015/06/19 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
简单介绍python封装的基本知识
2019/08/10 Python
Python中包的用法及安装
2020/02/11 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
2015年班级元旦晚会活动总结
2014/11/28 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
2015年护士节活动总结
2015/02/10 职场文书
运动会广播稿20字
2015/08/19 职场文书
golang语言指针操作
2022/04/14 Golang