首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django动态添加定时任务之django-celery的使用

定时任务和周期任务在我们日常工作中应用广泛,例如定时发布、周期巡检等,通常我们会借助Linux下的Crontab来实现,但如何将这一功能搬进我们自研的运维系统呢?借助django-celery即可轻松完成,本篇文章就通过自定义任务引擎Probius中计划任务的实现来介绍django-celery的使用

Celery是基于Python开发的一个分布式任务队列框架,主要用来实现异步任务,具体介绍和用法可以看我之前写的这篇文章:Django配置Celery执行异步任务和定时任务,Django本身不支持异步,要想实现异步的话借助Celery是个不错的选择,上边这篇文章就提供了django集成celery的方法,但其配置稍微复杂,且不支持动态添加定时任务,django-celery的出现很好的解决了这个问题

django-celery为django提供了celery集成,同时支持将结果存储在django的orm或cache中,最重要的是支持从数据库动态读取计划任务并执行,这也就是说我们只需要将需要执行的加护任务插入数据库,django-celery就可以自动发现并执行了,接下来就具体看下如何实现

安装配置

1.  安装

2.  的中加入

3.  中添加如下配置

4.  启动celery

至此就可以使用djcelery来处理异步任务了

异步调用

具体的用法为在app根目录下添加一个文件,在文件中编写函数,给函数添加上装饰器即可

假设一个项目有如下目录结构

我们在名为的app下添加文件,文件内容如下

然后就可以在view或其他地方异步调用这个函数了

周期任务

以上只是将任务变成了异步,如果我们想要周期执行任务,该如何操作呢?

1.  首先需要执行命令在数据库创建表

2.  然后修改文件中添加配置

3.  最后启动beat

至此任务就会在设置的时间执行了

报错处理

PS: 启动beat时可能会有如下报错

这主要是因为时区引起的,请修改时区相关的配置

动态添加

至此已经可以添加周期任务或定时任务了,但操作方式比较麻烦,还需要改动配置文件,说好的动态添加呢,别急这就来了,打开数据库会看到几张以开头的表

其中对于动态添加计划任务有用的是计划任务时间定义表,循环任务时间定义表,以及任务表

只需要在对应的表里插入数据就ok了,以我在自定义任务引擎Probius中的使用为例,前端会传递时间到view,view中关于定时任务的的大概处理逻辑如下

通过创建一个事物,保证时间和任务都能同时添加成功,否则就回滚

然后通过方法去检索循环任务时间定义表,如果有就获取到实例,没有就创建

最后往任务表里插入任务,为任务名称,具有唯一性,所以这里加了时间前缀防止重复,为celery的task任务,字符串类型,在启动celery的时候就可以看到,传给任务的参数,这里也可以用kwargs的字典形式传,就把字段改成即可,定义了这个任务是启动或关闭状态,为循环任务时间实例,如果这里要用周期任务,就是每n秒n分循环执行这样的,只需要将关联换成即可,那就需要事先往表里插入数据

还记得开头settings.py配置文件中我们配置的吗?就因为有这个配置,所以当数据表里的数据变更之后,celery的beat程序就能监听到从而在配置的时间触发worker去执行任务

至此,主要功能我们都已实现,django-celery的计划任务只能支持固定时间吗?其实不然,他支持的语法与linux下的crontab类似,像这样的复杂语法也是支持的,在Probius中对于复杂语法我们也直接提供了更为灵活的自定义任务执行方式

为了便于使用,减少学习成本,这里就直接用了linux下crontab的格式,传到后端后解析成对应的时间写入数据库。有些小伙伴跟我说开发出来的工具没人用,或者是其他部门推不动,项目开发中的这些个细节考虑到位,尽量减少用户学习使用成本,做的足够好用、易用,还怕没有人用嘛

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201229A0HZ5S00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券