怎样实现短信验证码/邮箱验证码的异步发送

前言: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的工做原理:

  • 任务队列是一种跨线程、跨机器工做的一种机制
  • 任务队列中包含任务的工做单元。有专门的工做进程持续不断的监视任务队列,并从中得到新的任务并处理
  • Celery经过消息进行通讯,一般使用一个叫broker(中间人)来协client(任务的发出者)和worker(任务的处理者)
  • client发出消息到队列中,broker将队列中的信息派发给worker来处理
  • 一个Celery系统能够包含不少的worker和broker,可加强横向扩展性和高可用性能

6.利用celery实现短信验证码/邮箱验证码的异步发送

  (1)建立celery_task模块,目录结构以下图所示

    

   main---->

   Celery------>检测任务(broker)

   config------>配置文件

   tasks ------>代码的主体(worker)

  (2)设置中间人

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

   咱们采用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

 

 

  这样咱们就能实现短信验证码的异步发送了(邮箱验证同样)

相关文章
相关标签/搜索