1
利用多線程以裝飾器的方式實現異步執行
例:執行此任務
from time import sleep
def i():redis
sleep(3) print('任務1')
def j():算法
print('任務2')
i()
j()
執行結果:
(等待三秒鐘後)
任務1
任務2django
把裝飾器封裝入一個模塊加入線程裝飾器後
裝飾器爲(
import threading多線程
def thd(a):併發
def wrapper(*args,**kwargs): thd=threading.Thread(target=a,args=args,kwargs=kwargs) thd.start() return wrapper
)app
from time import sleep
from td import thd異步
@thd
def i():分佈式
sleep(3) print('任務1')
def j():工具
print('任務2')
i()
j()
執行結果爲:
任務2
(間隔3秒)
任務1優化
淺析:適合較長cpu時間運算的場合,好比圖像處理,算法執行。只有少數幾個併發操做的時候還無傷大雅,若是須要處理大量的併發操做時就不合適了。由於上下文切換的開銷,增長資源消。
2.
celery:
Celery 是一個簡單、靈活且可靠的,處理大量消息的分佈式系統,而且提供維護這樣一個系統的工具。Celery能夠幫助咱們快速在不一樣的機器設定不一樣任務。專一於實時處理的任務隊列,同時也支持任務調度。
例:實現異步發送短信功能
建立celery_tasks用於保存celery異步任務。
celery_tasks目錄下建立config.py文件,用於保存celery的配置信息
roker_url = "redis://127.0.0.1/10"
在celery_tasks目錄下建立main.py文件,用於做爲celery的啓動文件
from celery import Celery
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings.dev'
app = Celery('xxx')
app.config_from_object('celery_tasks.config')
app.autodiscover_tasks(['celery_tasks.sms'])
在celery_tasks目錄下建立sms目錄,用於放置發送短信的異步任務相關代碼。
將提供的發送短信的雲通信SDK放到celery_tasks/sms/目錄下。
在celery_tasks/sms/目錄下建立tasks.py文件,用於保存發送短信的異步任務
# 發送短信驗證碼
sms_code_expires = constants.SMS_CODE_REDIS_EXPIRES // 60 sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires) return Response({"message": "OK"})
淺析:
優勢:
簡單: celery使用很簡單, 你能夠不用配置就能夠啓動一個任務
高度可用: worker和clients會自動處理失敗或丟失的消息
快: 一個celery每分鐘能夠處理數百萬的任務(使用RabbitMQ並作好優化)
靈活: 幾乎Celery的每一個部分均可以自行擴展或使用, 自定義池實現, 序列化器, 壓縮方案, 日誌記錄, 調度程序, 消費者, 生產者, 代理傳輸等等
缺點:
celery的任務隊列長度,若隊列中的任務過多,則可能致使長時間等待,下降效率。
歡迎補充,謝謝觀看