前言: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
這樣咱們就能實現短信驗證碼的異步發送了(郵箱驗證同樣)