任务调度利器:Celery

1.Celery介绍

点击查看Celery参考文档
Celery是一个功能完备即插即用的任务队列
Celery适用异步处理问题,比如发送邮件、文件上传,图像处理等等比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验

2.Celery特点:

简单,易于使用和维护,有丰富的文档
高效,单个Celery进程每分钟可以处理数百万个任务
灵活,Celery中几乎每个部分都可以自定义扩展
Celery非常易于集成到一些web开发框架中

3.Celery组成结构

任务队列是一种跨线程、跨机器工作的一种机制
任务队列中包含任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理
Celery通过消息进行通信,通常使用一个叫broker(中间人)来协client(任务的发出者)和worker(任务的处理者)
client发出消息到队列中,broker将队列中的信息派发给worker来处理
一个Celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。
Celery组成结构是生产者消费者模型的一种体现
Celery使用

一、安装Celery

# 进入虚拟环境
  pip install celery==4.1.0

二、创建Celery异步任务文件 tasks.py

三、创建应用对象/客户端/client

应用对象内部封装要异步执行的任务
Celery():
参数1是异步任务路径
参数2是指定的broker
redis://密码@redis的ip:端口/数据库
redis://192.168.243.191:6379/4
返回客户端应用对象app
send_active_email():内部封装激活邮件内容,并用装饰器@app.task注册
调用python的send_mail()将激活邮件发送出去

代码参考:

#定义任务函数:

 from celery import Celery
 from django.core.mail import send_mail
 from django.conf import settings

 # 创建celery应用对象
 app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/1')

 @app.task
 @app.task
 def send_active_email(username, receiver, token):
     """封装发送邮件方法"""

     subject = "天天生鲜用户激活"          # 标题
     message = ""                        # 邮件正文(纯文本)
     sender = settings.EMAIL_FROM        # 发件人
     receivers = [receiver]              # 接收人, 需要是列表
     # 邮件正文(带html样式)
     html_message = '<h2>尊敬的 %s, 感谢注册天天生鲜</h2>' \
                    '<p>请点击此链接激活您的帐号: ' \
                    '<a href="http://127.0.0.1:8000/users/active/%s">' \
                    'http://127.0.0.1:8000/users/active/%s</a>' \
                    % (username, token, token)
     send_mail(subject, message, sender, receivers, html_message=html_message)
     
     
#注册发送邮件代码修改:

 class RegisterView(View):
     """注册"""

     def post(self, request):
         ...

         # 业务处理
         # 保存用户到数据库中
         try:
             user = User.objects.create_user(username=username,
                                             password=password,
                                             email=email)
         except IntegrityError:
             return render(request, 'register.html', {'message': '用户名已存在'})

         # todo: 发送激活邮件
         token = user.generate_active_token()
         # send_active_email(username, email, token)
         # 使用celery异步发送激活邮件
         send_active_email.delay(username, email, token)

         # 响应请求,返回html页面
         return HttpResponse("进入登录界面")

四、中间人broker

启动Redis作为中间人:

sudo redis-server /etc/redis/redis.conf

说明:

示例:此处演示Redis数据库作为中间人broker Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人。 作为中间人,我们有几种方案可选择:

1.RabbitMQ

RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。
使用RabbitMQ的细节参照以下链接:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq

如果使用的是Ubuntu或者Debian发行版的Linux,可以直接通过命令安装RabbitMQ:sudo apt-get install rabbitmq-server

安装完毕之后,RabbitMQ-server服务器就已经在后台运行。

如果用的并不是Ubuntu或Debian, 可以在以下网址:
http://www.rabbitmq.com/download.html
去查找自己所需要的版本软件。
2.Redis

Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。
关于是由那个Redis作为Broker,可访下面网址:
http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis

五、Celery服务器创建worker步骤

把项目代码拷贝一份到桌面

修改项目代码: 在celery_tasks/tasks.py文件顶部添加以下代码, 作用:让Celery的worker能够加载Django配置环境。 注意: 服务器端的代码才需要添加

# 添加到celery服务器所在电脑的项目中, 
 # 让celery执行发送邮件前初始化django环境
 import os
 import django
 # 设置环境变量
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
 # 初始化django环境
 django.setup()

 from celery import Celery
 from django.core.mail import send_mail
 from django.conf import settings

 # 创建celery应用对象
 app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/1')
 ...

进入到桌面的项目中,启动celery服务器(worker)

# 在虚拟环境下执行
 celery -A celery_tasks.tasks worker -l info
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值