Django框架中,使用celery實現異步

做用:在使用框架時,在視圖函數中實現異步
構成:
任務task:一段耗時並與響應結果無關的代碼,如發短信
工人worker:新進程,用於執行任務代碼
代理人broker:調用任務時,將任務添加到隊列中,通知worker執行
隊列queue:用於存儲待執行的任務python

調用:任務函數.delay(參數)redis

說明:定義任務函數的文件tasks.py,文件名是固定的
實現步驟:
1.在項目目錄下,新建包celery_tasks用於保存celery異步任務
2.在celery_tasks包下新建config.py,指定代理人,用於保存celery的配置信息django

# 指定使用redis做爲代理人,未來,redis會存儲待執行任務隊列
broker_url = 'redis://127.0.0.1:6379/14'

3.在celery_tasks包下新建main.py,建立celery對象,配置自動識別任務,用於做爲celery的啓動文件app

from celery import Celery

# 爲celery使用django配置文件進行設置
import os
os.environ['DJANGO_SETTINGS_MODULE'] = '(項目settings地址)'

# 建立celery應用,Celery(‘名字可隨意’)
app = Celery('taobao')

# 導入celery配置
app.config_from_object('celery_tasks.config')

# 自動註冊celery任務
app.autodiscover_tasks([
    'celery_tasks.sms_code',
]) 

4.在celery_tasks新建包,如sms_code框架

5.在celery_tasks/sms_code/下建立tasks.py,用於保存發送短信的異步任務
6.定義方法,封裝耗時代碼,添加裝飾器dom

from celery_tasks.main import app

@app.task(name='send_sms_code')
def send_sms_code(code):
    # 定義方法,封裝耗時代碼
    print(code)

7.在main.py中註冊
8.啓動工人,若是代碼發生改變,須要重啓任務
9.在視圖函數中調用verifications/views.py:任務方法.delay(參數)(這裏沒有調用第三方接口發短信,只是打印出驗證碼)異步

  

class SmsView(APIView):
    # 接收手機號,發短信
    def get(self, request, mobile):
        # 鏈接redis,指定cache中的鍵
        redis_cli = get_redis_connection('sms_code')

        # 1.驗證是否向此手機號發太短信,若是發過則返回提示
        if redis_cli.get('sms_flag_' + mobile):
            return Response({'message': '已經發送'})

        # 2.若是未發過,則發短信
        # 2.1生成隨機6位數
        sms_code = random.randint(100000, 999999)

        # 優化,只與redis交互一次
        redis_pipeline = redis_cli.pipeline()
        redis_pipeline.setex('sms_' + mobile, constants.SMS_CODE_EXPIRES, sms_code)
        redis_pipeline.setex('sms_flag_' + mobile, constants.SMS_FLAG_EXPIRES, 1)
        redis_pipeline.execute()

        # 2.4發短信,能夠調用第三方短信平臺發短信
        # print(sms_code)
        send_sms_code.delay(sms_code)

        # 3.響應
        return Response({'message': 'OK'})

  

10.啓動celery服務函數

執行命令優化

celery -A celery_tasks.main worker -l info
相關文章
相關標籤/搜索