您的位置:首页 > 编程语言 > Go语言

如何使用Celery在DRF(Django rest framework)中提高服务器并发实现

2018-07-20 20:08 1196 查看

一、原理


首先图片中的客户端代表需要提高并发的服务器,Broker队列通常保存任务,一般使用Redis/RabbitMQ实现,任务处理者便是Celery实例了
如图:celery客户端遇到耗时操作任务的时候,直接将任务发送到Broker(中间人)来协client(任务的发出者)和worker(任务的处理者)。需要注意的是,Celery在DRF中是以单独的应用出现的,拥有自己的空间,一旦client将任务推送Broker,client就会处理其他请求,完成高度并发并不等待client用户io操作。

二、实现

首先我们得安装Celery应用
我们可以使用python的包管理器pip来安装:

pip install -U Celery

也可从官方直接下载安装包:Celery官网

tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python setup.py build
python setup.py install

1、搭建Celery应用

我们要在项目的同级目录搭建新的独立的Celery应用,首先我们需要创建一个celery_tasks的包,并在celery_tasks/目录下创建main.py作为Celery的启动文件,创建config.py作为Celery的配置文件。同时把我们需要处理的业务(以msg发送短信为例)放到celery_tasks/下,并为其创建tasks.py。注意tasks.py不允许重命名。最终的目录搭建结构如下图

2、main.py

from celery import Celery

# 为celery使用django配置文件进行设置,根据自己项目设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'

# 创建celery应用
app = Celery('meiduo')

# 导入celery配置
app.config_from_object('celery_tasks.config')

# 自动注册celery任务
app.autodiscover_tasks(['celery_tasks.sms'])
[/code]

3、config.py

# 配置Celery的Broker队列存放在Redis的14号库中
broker_url = "redis://127.0.0.1/14"
[/code]

4、tasks.py

# 加载的日志模块
import logging

# 导入Celery实例
from celery_tasks.main import app
# 导入发送短信的实例
from .yuntongxun.sms import CCP

logger = logging.getLogger("django")

# 验证码短信模板
SMS_CODE_TEMP_ID = 1

# 注意只有使用Celery实例装饰的应用才会生效
@app.task(name='send_sms_code')
def send_sms_code(mobile, code, expires):
"""
发送短信验证码功能实现
:param mobile: 手机号
:param code: 验证码
:param expires: 有效期
:return: None
"""

try:
ccp = CCP()
result = ccp.send_template_sms(mobile, [code, expires], SMS_CODE_TEMP_ID)
except Exception as e:
logger.error("发送验证码短信[异常][ mobile: %s, message: %s ]" % (mobile, e))
else:
if result == 0:
logger.info("发送验证码短信[正常][ mobile: %s ]" % mobile)
else:
logger.warning("发送验证码短信[失败][ mobile: %s ]" % mobile)
[/code]

5、服务端启动celer_tasks

# 导入Celery具体的应用
from celery_tasks.sms import tasks as sms_tasks

class SMSCodeView(GenericAPIView):
...
# 发送短信验证码,一定加delay
sms_tasks.send_sms_code.delay(mobile, 67868, 5)

return Response({"message": "OK"})
[/code]

到此位置就完成了Celery在DRF中的发送短信应用的高并发实现

6、启动celery任务

celery -A tasks worker -l info
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: