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实现ftp客户端示例分享
Feb 17 Python
优化Python代码使其加快作用域内的查找
Mar 30 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
python机器学习之贝叶斯分类
Mar 26 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
学习python的前途 python挣钱
Feb 27 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python 处理文件的几种方式
Aug 23 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
Python爬取网页信息的示例
Sep 24 Python
Pytest中conftest.py的用法
Jun 27 Python
Python与C++中梯度方向直方图的实现
Mar 17 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将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
javascript import css实例代码
2008/07/18 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
js document.write()使用介绍
2014/02/21 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
django 模型字段设置默认值代码
2020/07/15 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
Java和Javasciprt的区别
2012/09/02 面试题
四好少年事迹材料
2014/01/12 职场文书
遗产继承公证书
2014/04/09 职场文书
青奥会口号
2014/06/12 职场文书
助学贷款贫困证明
2014/09/23 职场文书
中小学生学籍证明
2014/10/25 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
单位综合评价意见
2015/06/05 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
python文件与路径操作神器 pathlib
2022/04/01 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android
python绘制云雨图raincloud plot
2022/08/05 Python