1. 程式人生 > >Django框架上使用Celery非同步執行任務

Django框架上使用Celery非同步執行任務

使用Django框架程式設計時, 由於框架的封裝限制,在沒有編寫底層程式碼的情況下,要把一段程式碼放到一個新的程序裡去執行,我們就會使用非同步執行任務的包Celery。
虛擬環境安裝celery

pip install celery

一般把耗時的函式放在任務之中去執行,以傳送簡訊為例:
概念:
任務task:一個耗時的函式,開發人員封裝的函式,定義了耗時的程式碼
佇列queue:儲存任務的地方,如redis,儲存要執行的函式的名稱
代理人broker:接收通知,將任務加入佇列→呼叫者,任務函式.delay()
工人worker:從佇列中讀取任務,執行。對應一個新的程序

使用celery發簡訊例子步驟:
建立一個celery_task包用來編寫非同步模組,再在該此包下建立一個config.py檔案和一個main.py檔案,檔案目錄結構如下
celery

1.配置config,main檔案

config.py配置如下

broker_url='redis://127.0.0.1:6379/15'

main.py配置如下

from celery import Celery

# 為celery使用django配置檔案進行設定
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'sms.setting'  # 專案的setting配置路徑,根據自己專案的實際配置路徑更改

# 建立celery應用
app = Celery('sms')  

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

# 自動註冊celery任務,即自己編寫的tasks.py裡的函式
app.autodiscover_tasks([
]) 

2.自定義任務

建立sms包(為解耦之後的其他耗時模組,都用獨立的包來編寫各自的邏輯)
建立tasks.py 注意:固定只能取名tasks
定義函式
新增裝飾器@app.task

from celery_tasks.main import app

@app.task
def send_sms(mobile):
   	pass  
        

回過頭來,在main.py註冊列表裡新增自己所寫的函式,用於自動識別任務

···
app.autodiscover_tasks([
	'send_sms'
]) 

3.呼叫

函式.delay(引數)

send_sms.delay(mobile)

4.啟動工人

celery -A celery_tasks.main worker -l info