python中實現異步任務的方式淺析

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

爲celery使用django配置文件進行設置

import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):

os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings.dev'

建立celery應用

app = Celery('xxx')

導入celery配置

app.config_from_object('celery_tasks.config')

自動註冊celery任務

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的任務隊列長度,若隊列中的任務過多,則可能致使長時間等待,下降效率。

歡迎補充,謝謝觀看

相關文章
相關標籤/搜索