怎樣實現短信驗證碼/郵箱驗證碼的異步發送

前言: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

 

 

  這樣咱們就能實現短信驗證碼的異步發送了(郵箱驗證同樣)

相關文章
相關標籤/搜索