做用:在使用框架時,在視圖函數中實現異步
構成:
任務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