前言:html
随着互联网的飞速发展,随之而来的咱们以往的配置已经没法知足用户的需求,咱们须要寻求更高效更便捷的方法来应对不一样的需求,其中有同步到异步的过分就是一个很好的例子,接下来咱们将利用异步实现短信/邮箱的异步发送python
1.同步web
多任务, 多个任务之间执行的时候要求有前后顺序,必须一个先执行完成以后,另外一个才能继续执行, 只有一个主线redis
2.异步
数据库
多任务, 多个任务之间执行没有前后顺序,能够同时运行,执行的前后顺序不会有什么影响,存在的多条运行主线django
3. 阻塞服务器
从调用者的角度出发,若是在调用的时候,被卡住,不能再继续向下运行,须要等待,就说是阻塞app
3.同步和异步的区别框架
同步在遇到一些外界未知因素时会发生阻塞,程序会暂停执行,即便后续有新的请求也没法执行,必需要等阻塞结束后才能执行后续的请求,形成了资源的极大的浪费异步
异步在遇到一些外界因素发生阻塞时会暂停该任务的执行转而执行其余的任务(该任务进入等待队列,等阻塞结束全部条件知足继续执行),异步不会等待程序的执行,可以更加充分了利用系统资源。
4. 配置celery
(1)什么是celery?
Celery是一个功能完备即插即用的任务队列,Celery适用异步处理问题,好比发送邮件、文件上传,图像处理等等比较耗时的操做,咱们可将其异步执行,这样用户不须要等待好久,提升用户体验
并且celery具备简单,易于使用和维护,有丰富的文档,高效,单个Celery进程每分钟能够处理数百万个任务,灵活,Celery中几乎每一个部分均可以自定义扩展,Celery很是易于集成到一些web开发框架中的特特色。
附上官方文档地址:http://docs.celeryproject.org/en/latest/index.htm
(2)安装celery(注意安装环境)
pip install celery
5.celery的工做原理
经过这张图咱们大体会了解到,celery的工做原理:
6.利用celery实现短信验证码/邮箱验证码的异步发送
(1)建立celery_task模块,目录结构以下图所示
main---->
Celery------>检测任务(broker)
config------>配置文件
tasks ------>代码的主体(worker)
(2)设置中间人
做为中间人,咱们有几种方案可选择:
1.RabbitMQ
使用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方式
(3)编写代码:
main.py
from celery import Celery import os #导入django的配置 # os.getenv("变量名") 获取环境变量 # os.environ['变量名'] 建立环境变量 if not os.getenv('DJANGO_SETTINGS_MODULE'): os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo.settings' # 建立app对象 # 声明主文件入口(当前模块的主模块名称) app = Celery('celery_tasks') # 引入配置文件 app.config_from_object('celery_tasks.config') # 建立任务并启动监测 app.autodiscover_tasks(['celery_tasks.sms'])
config.py
# 配置队列信息,将celery的队列存储到数据库redis的14号数据库中 # 讲执行的结果存储到redis15好数据库中 broker_url = "redis://127.0.0.1/14" result_backend = "redis://127.0.0.1/15"
tasks
""" 注意该文件的名必须是tasks,否则 main没法识别 """ from libs.yuntongxun.sms import CCP from celery_tasks.main import app # 必需要用app.task装饰,能够设置name设置名称 @app.task(name='send_sms_code') def send_sms_code(mobile,smscode): ccp = CCP() ccp.send_template_sms(mobile, [smscode, 5], 1)
7.测试
在虚拟环境中添加指令执行(pycahrm-终端)
celery -A celery对象的路径 worker -l info celery -A celery_tasks.main worker -l info
这样咱们就能实现短信验证码的异步发送了(邮箱验证同样)