Django项目中使用celery做异步任务

异步任务介绍

在写项目过程中经常会遇到一些耗时的任务, 比如:发送邮件、发送短信等等~。这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行

celery就是用于处理异步任务的框架,celery能完成的功能远不止异步任务,还有一个很常用的功能定时任务

架构图

Celery包含如下组件:

Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。

Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。

Broker:消息代理,或者叫作消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。

Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。

Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

Celery 安装

pipinstalldjango-celery celery-with-redis

项目结构

 

加载celery app(settings文件中)

 

添加Celery全局配置(settings文件中)

 

同步Celery表到数据库

pythonmanage.py migrate

创建celery.py文件(与settings同级)

 

创建任务文件

在需要使用异步任务的app中创建tasks.py,写入对应的任务函数,博主喜欢把tasks放在对应的app下,其实放在其他目录下也可以的,看个人习惯

 

触发任务

在对应的视图中导入tasks中的任务函数调用即可

 

启动Celery

进入opsweb工程下,启动Celery

 

备注:

本场景用户访问触发任务,流程如下:

用户页面上点击事件->调用任务/定时计划任务->任务进入redis队列

->如果celery启动则依次执行任务->如果celery没启动,则会存到redis

队列里,一旦启动就依次执行

启动Django

[vagrant@reboot opsweb]$python manage.py runserver0:8000

测试

页面上触发了异步任务就会在celery日志里看到任务信息,我这里只是写了简单的任务例子

 

计划任务 - djcelery

djcelery app提供了定时任务的功能,注册并同步到数据库之后,会生产五个表,结构如下:

 

在django后台可以看到注册的表

每个任务可以接受参数

定时任务函数

 

启动Celery beat

[vagrant@reboot opsweb]$ python manage.py celery beat# 启动定时任务

Celery会通过celery beat进程来完成. Celerybeat会保持运行, 一旦到了某一定期任务需要执行时, Celery beat便将其加入到queue中

supervisor管理Celery任务

配置如下

主动触发任务

 

定时任务触发

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值