基于Django+celery二次开发动态配置定时任务 ( 一 )

摘要:
因此,他决定编写一个定时任务管理系统,并将所有定时任务放在一个平台上进行管理。经过半个多月的调查,Django+Celery被发现是一个很好的解决方案。Django与dj芹菜模块相结合,可以在Django管理后台配置计划任务,但页面是死的,不灵活,因此只能再次开发一个页面进行配置管理。我的平台使用django,因此我们可以直接使用django-芹菜。如果平台是龙卷风、烧瓶和底部,我们如何用芹菜开发定时任务系统。

需求:

          前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统、监控,于是乎开发、测试、产品、运营、业务部、财务等等各个部门就跟那饥渴的饿狼一样需要

各种各样的系统数据满足他们。刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的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页面

基于Django+celery二次开发动态配置定时任务 ( 一 )第1张

periodic tasks 配置页面

基于Django+celery二次开发动态配置定时任务 ( 一 )第2张

 参数配置页面

基于Django+celery二次开发动态配置定时任务 ( 一 )第3张

periodic tasks 列表页面

基于Django+celery二次开发动态配置定时任务 ( 一 )第4张

我的定时任务脚本通常是根据开发给的SQL语句去生产库里抓取数据然后生成Excel文件再以邮件形式发给各个部门,因此需要传的参数有SQL语句(SQL有时十几个,而且

比屎还长)、每一个SQL执行的数据库、邮件收件人、邮件抄送人、邮件标题、Excel文件名等等,由于参数太多如果用django-admin里自带的页面进行配置task,那么就需

要在参数配置页面里写跟屎一样长的一大串列表或者字典,非常不方便,而且它的列表页面也不人性化,所以需要一个人性化的页面进行配置和管理。

 django-celery所生成的表

基于Django+celery二次开发动态配置定时任务 ( 一 )第5张

经过测试发现在django-admin所做的修改其实都是修改数据库,修改后django-celery会实时推送到celery-beat里生效。所以只要再开发一个页面去配置

djcelery_periodictask及其它表就可以了。

 定时任务列表页面,对应djcelery_periodictask表

基于Django+celery二次开发动态配置定时任务 ( 一 )第6张

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

基于Django+celery二次开发动态配置定时任务 ( 一 )第7张

基于Django+celery二次开发动态配置定时任务 ( 一 )第8张

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

基于Django+celery二次开发动态配置定时任务 ( 一 )第9张

crontab编辑页面

基于Django+celery二次开发动态配置定时任务 ( 一 )第10张

总结:

          从技术调研到开发、测试完成折腾了一个多月,这样统一到一个平台管理后更加方便快捷,配置、修改一个定时任务分分钟搞定。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二次开发动态配置定时任务 ( 一 )》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇powerbuilder 在pb里面怎么把文件编译成exe文件Django项目中关于redis包版本的坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PyMongo 常见问题

PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实例,必须小心。具体来说,MongoClient实例不能从父进程复制到子进程,父进程和每个子进程必须创建属于自己的MongoClient实例。由于本身的不兼容性...

Python学习第118天(Django回头看:MVCMTV、Django初步、static、url命名、分区)

今天开始重新复习,内容看的也更连贯一些,下面开始内容复述,先说一下MTV和MVC的问题 MVC(modles views controller)即web应用模型,可以指代各种各样的模型 modles即为模型 views 视图,特指用户看到的html文件 controller控制器 MTV(modles template views)即为Django模型,...

总目录

博客总目录Python部分 计算机基础,Python之变量以及简单的循环 Python基础数据类型之int、bool、str Python基础数据类型之列表和元组 Python基础数据类型之字典 Python之格式化输出,初始编码以及运算符 Python之编码 Python基础数据类型之集合以及其他和深浅copy Python之文件操作 Python 中...

扩展Django中的分页

Django中封装了分页模块,定义了两个类分别是Paginator和Page。虽然可以满足一般的需求,但是稍想添加点新的功能就显得鸡肋,而且创建paginator类对象时需要传人所有的数据对象(由于django的惰性查询所以适用django),没有可移植性。 下面先在原分类模块基础上另外封装两个功能,分别实现设置页面最多显示页码数 和切换页码时保留原搜索条...

django models def __str__(self)

1、 https://blog.csdn.net/wyongkang/article/details/116229846 https://my.oschina.net/u/4380404/blog/4094774 2、 https://www.zhihu.com/question/273973677/answer/371354850 3、 https://...

异步任务分发模块Celery

Celery简介 Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。 celery适用异步处理问题,当遇到发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 celery的特点是: 简单,易于使用和维护,有丰富的文档。 高效,单个celery进程每...