结合Django+celery二次开发定时周期任务
需求:
前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统、监控,于是乎开发、测试、产品、运营、业务部、财务等等各个部门就跟那饥渴的饿狼一样需要
各种各样的系统数据满足他们。刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的SQL、收件人、执行时间等等参数就可以几分钟写完一个定时任务脚本
,到后面不知道是不是吃药了一天三四个定时任务,不到半个月手里一下就20多个定时任务了,渐渐感到力不从心了,而且天天还要给他们修改定时任务的SQL、收件人、执
行时间等等,天天写定时任务脚本都写到想吐,真是心里面一万只草泥马崩腾而过。于是乎下定决心写一个定时任务管理系统,把所有的定时任务都统一放到一个平台上进行
管理,经过大半个月的调查发现Django+Celery是一个不错的方案。Django结合djcelery模块可以在django-admin管理后台配置定时任务,但是页面是写死的不灵活,所
以只能再二次开发一个页面进行配置管理。
详细的安装步骤不细说,网上有大量文档,我是参照51cto一位哥们儿安装的。
celery3.x版本安装:http://shineforever.blog.51cto.com/1429204/1737323
celery4.x版本安装:http://www.cnblogs.com/alex3714/p/6351797.html (金角大王)
我选择的是celery3.x版本的,用的django-celery模块,celery4.x用的是django-celery-beat,因为celery4.x版本的django-celery-beat在djang-admin后台
添加task后系统不会对修改后的任务即时生效,而是需要重启celery-beat服务才能生效,真你妹擦蛋,而且网上一直没找到解决方案,所以选择了celery3.x版本
,此版本在django-admin后台增删改查task后不用重启celery-beat就能生效。
django-admin页面

periodic tasks 配置页面

参数配置页面

periodic tasks 列表页面

我的定时任务脚本通常是根据开发给的SQL语句去生产库里抓取数据然后生成Excel文件再以邮件形式发给各个部门,因此需要传的参数有SQL语句(SQL有时十几个,而且
比屎还长)、每一个SQL执行的数据库、邮件收件人、邮件抄送人、邮件标题、Excel文件名等等,由于参数太多如果用django-admin里自带的页面进行配置task,那么就需
要在参数配置页面里写跟屎一样长的一大串列表或者字典,非常不方便,而且它的列表页面也不人性化,所以需要一个人性化的页面进行配置和管理。
django-celery所生成的表

经过测试发现在django-admin所做的修改其实都是修改数据库,修改后django-celery会实时推送到celery-beat里生效。所以只要再开发一个页面去配置
djcelery_periodictask及其它表就可以了。
定时任务列表页面,对应djcelery_periodictask表

新增或修改配置定时任务页面


crontab执行时间的列表页面,这个页面和django-admin一样,照搬的,这样就不用再跑到admin页面去配置。

crontab编辑页面

总结:
从技术调研到开发、测试完成折腾了一个多月,这样统一到一个平台管理后更加方便快捷,配置、修改一个定时任务分分钟搞定。celery支持集群,
如果以后任务多了,成百上千的定时任务就可以用celery的集群。
有时候有些定时任务会因为某些原因失败,所以我还想对执行的任务进行监控,我想知道每天有多少任务执行成功、有多少失败、耗时多长时间、
如果执行失败,失败原因是什么等等,刚开始用的flower,但是在django项目里app少的时候可以把flower服务起来,我的项目十多个app硬是没起来,只好放弃,
而且flower的监控页面跟django-admin里的一样periodic_tasks页面一样直接显示的所有参数值,非常不人性化,还需要二次开发,这样还是自己写一个celery的
监控。
我的平台用的是django,所以可以直接用django-celery,如果平台是tornado、flask、bottle那又该怎么结合celery来开发定时任务系统。根据网上一个哥
们儿的分析,原来django-celery是自已定义了一个任务调度器,在django-admin页面里配置、修改任务以后如何将这些修改反应到celery-beat里都是调度器完成
的,也就是这个DatabaseScheduler模块
from djcelery.schedulers import DatabaseScheduler
settings里还需要指定任务调度器,很熟悉吧。
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务调度器
所以,如果要结合tornado、flask、bottle就需要自定义一个调度器,我也很推荐这种方法,奈何自己代码能力有限,不知如何下手,有机会还是要试试。
哥们儿博客地址:http://www.liuliqiang.info/post/celery-advanced-topic-scheduler-and-priority/,里面有他自己写的调度器,大湿(师)啊。
有几个注意点:
1.时区
刚开始时区不准,一直是UTC时间,后来索性把utc禁用,在settings里增加配置
CELERY_ENABLE_UTC = False
2.内存泄漏
刚开始我开了10个worker跑定时任务,跑10多个定时任务,才跑两天就发现woker占的内存越来越大一直不释放,后来发现默认每个worker跑完100个任务后才
会自我销毁程序重建来释放内存,所以需要增加一个配置定义每个worker执行多少个任务后才会自我销毁重建。
CELERYD_MAX_TASKS_PER_CHILD = 3 # 每个worker最多执行3个任务就会被销毁,可防止内存泄露
结合Django+celery二次开发定时周期任务的更多相关文章
- 基于Django+celery二次开发动态配置定时任务 ( 一 )
需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- Django+Celery框架自动化定时任务开发
本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本.业务场景接口自动化测试脚本.App自动化测试脚本.Web自动化 ...
- Expo大作战(二)--expo的生命周期,expo社区交流方式,expo学习必备资源,开发使用expo时关注的一些问题
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 04 用户个人信息和二次开发django的文件存储系统
用户的个人信息的前端页面如下: 业务逻辑分析 从上图中可以看出,需要后端传送的数据有,用户的名字和练习的地址,和最近的浏览记录. 用户的名字和联系的地址可以通过地址表(adress)中获得,地址表可以 ...
- Celery 异步定时周期任务
1/什么是Celery Celery 是基于Python实现的模块,用于执行异步定时周期任务的 其结构的组成是由 1.用户任务app 2.管道 broker 用于存储任务 官方推荐 redis rab ...
- Django Admin后台管理功能使用+二次开发
一 使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7 (Windows x86-64 executable in ...
- Django + Celery 实现动态配置定时任务
哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...
- django celery redis 定时任务
0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择. cele ...
随机推荐
- [技术讨论]关于前几天公布的京东bug上的问题分析
1. 起因 前两天我公布了一个京东微信端截取到的三张图.并简单阐述了这三张图中的bug发现过程: 有朋友的评价是图中这种,可实际上.他应该是没有看出来这个bug代表的内容有多少.今天心血来潮决定具体 ...
- Django之邮件发送
settings.py #settings 添加如下配置进行邮件发送 #邮件服务器 EMAIL_HOST = "smtp.qq.com" #邮件发送的端口 EMAIL_PORT = ...
- Chrome自带恐龙小游戏的源码研究(完)
在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...
- servletResponse 请求重定向
package response;/* * 重定向特点: * 1,浏览器会向服务器发送两次请求,意味着就有两个request\response * 2,用重定向技术,浏览器地址栏会发生变化 * * ...
- uboot之run_command简单分析
本文档简单分析了uboot中命令的实现.run_command函数的实现以及从uboot命令行接收并处理命令的过程. 作者: 彭东林 邮箱: pengdonglin137@163.com http:/ ...
- linux uart驱动——uart原理(一)
UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232.RS499.R ...
- 深入Asyncio(十二)Asyncio与单元测试
Testing with asyncio 之前有说过应用开发者不需要将loop当作参数在函数间传递,只需要调用asyncio.get_event_loop()即可获得.但是在写单元测试时,可能会需要用 ...
- vue element-ui 自动获取光标
<el-input ref="customerInput"></el-input> this.$refs.mark.$el.querySelector('i ...
- MarkdownPad - The Markdown Editor for Windows http://markdownpad.com/
MarkdownPad - The Markdown Editor for Windows http://markdownpad.com/
- 使用vscode写typescript(node.js环境)起手式
动机 一直想把typescript在服务端开发中用起来,主要原因有: javascript很灵活,但记忆力不好的话,的确会让你头疼,看着一月前自己写的代码,一脸茫然. 类型检查有利有敝,但在团队开发中 ...