飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:发送短信出现问题:
1:问题描述:由于容联云接口依赖网络,如果发送容联云一直不响应,那么就导致我的django程序一直堵塞在这里,这里就会频繁给容联云发送请求。给前端带来的效果就是点击注册之后一直无法响应,页面一直不动,也不会出现倒计时。
在这里插入图片描述
二:异步任务:
目的:解耦合
将发送短信的业务,交给专门的异步任务去处理,自己不再管了,而是再向下处理。而我们称发布任务的叫做:生产者,接收任务的叫做:消费者
在这里插入图片描述
三:celery框架:
采用生产者消费者设计模式:生产者将任务发布到消息队列中,消费者在任务队列中提取任务并且执行。这个项目生产者是: django,消息队列是: redis数据库 , 消费者是:celery框架。
在这里插入图片描述
四:准备工作:
1:安装celery依赖包:

pip install Celery -i https://pypi.tuna.tsinghua.edu.cn/simple

2:在外层 meiduo_mall 增加一个包, 名字叫做: celery_tasks
3:在 celery_tasks 包中添加 main.py 文件:里面先Celery这个类,然后创建一个Celery对象。

# 从你刚刚下载的包中导入 Celery 类
from celery import Celery


# 利用导入的 Celery 创建对象
celery_app = Celery('meiduo')

4:在 celery_tasks 包中再添加一个 config.py 文件:
在配置文件中指定消息队列:使用redis的3号库。

broker_url='redis://192.168.203.153:6379/3'

5:将配置文件加载到main.py中:
注意:指定配置文件的参数:是config.py的导包路径。

celery_app.config_from_object('celery_tasks.config')

6: celery_tasks 包下, 再创建一个包,起名为sms。(名字任意)
7:在sms包中创建一个tasks.py文件(文件名固定)
8:在main.py中设置自动捕获task.py中的任务。
注意:autodiscover_tasks,里面写一个包的导包路径,这样会自动检索包内的文件。

celery_app.autodiscover_tasks(['celery_tasks.sms'])

9:将云通讯复制到celery_task中来,因为以后要剥离业务。

五:业务实现:在task中做业务:
1:注意:这里需要celery_tasks语法糖装饰一下。

from celery_tasks.main import celery_app

@celery_app.task(name='ccp_send_sms_code')
def ccp_send_sms_code(mobile, sms_code):
    '''该函数就是一个任务, 用于发送短信'''
    result = CCP().send_template_sms(mobile,[sms_code, 5],1)
    return result

2:修改原来的调用: meiduo_mall/verifications/views

from celery_tasks.sms.tasks import ccp_send_sms_code
# 原来的写法:
# CCP().send_template_sms(mobile, [sms_code, 5], 1)

# 改为现在的写法, 注意: 这里的函数,调用的时候需要加: .delay()
ccp_send_sms_code.delay(mobile, sms_code)

2:启动服务:

cd ~/projects/meiduo_project/meiduo_mall
celery -A celery_tasks.main worker -l info
posted on 2020-09-04 17:30  飞行的猪哼哼  阅读(40)  评论(0)    收藏  举报