您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何在Django中使用Celery異步任務隊列,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、Django中的異步請求
Django Web中從一個http請求發起,到獲得響應返回html頁面的流程大致如下:http請求發起 -- http handling(request解析) -- url mapping(url正則匹配找到對應的View) -- 在View中進行邏輯的處理、數據計算(包括調用Model類進行數據庫的增刪改查)--將數據推送到template,返回對應的template/response。
圖1. Django架構總覽
同步請求:所有邏輯處理、數據計算任務在View中處理完畢后返回response。在View處理任務時用戶處于等待狀態,直到頁面返回結果。
異步請求:View中先返回response,再在后臺處理任務。用戶無需等待,可以繼續瀏覽網站。當任務處理完成時,我們可以再告知用戶。
二、關于Celery
Celery是基于Python開發的一個分布式任務隊列框架,支持使用任務隊列的方式在分布的機器/進程/線程上執行任務調度。
圖2. Celery架構
圖2展示的是Celery的架構,它采用典型的生產生-消費者模式,主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)。實際應用中,用戶從Web前端發起一個請求,我們只需要將請求所要處理的任務丟入任務隊列broker中,由空閑的worker去處理任務即可,處理的結果會暫存在后臺數據庫backend中。我們可以在一臺機器或多臺機器上同時起多個worker進程來實現分布式地并行處理任務。
三、Django中Celery的實現
在實際使用過程中,發現在Celery在Django里的實現與其在一般.py文件中的實現還是有很大差別,Django有其特定的使用Celery的方式。這里著重介紹Celery在Django中的實現方法,簡單介紹與其在一般.py文件中實現方式的差別。
1. 建立消息隊列
首先,我們必須擁有一個broker消息隊列用于發送和接收消息。Celery官網給出了多個broker的備選方案:RabbitMQ、Redis、Database(不推薦)以及其他的消息中間件。在官網的強力推薦下,我們就使用RabbitMQ作為我們的消息中間人。在Linux上安裝的方式如下:
sudo apt-get install rabbitmq-server
命令執行成功后,rabbitmq-server就已經安裝好并運行在后臺了。
另外也可以通過命令rabbitmq-server來啟動rabbitmq server以及命令rabbitmqctl stop來停止server。
更多的命令可以參考rabbitmq官網的用戶手冊:https://www.rabbitmq.com/manpages.html
2. 安裝django-celery
pip install celery pip install django-celery
3. 配置settings.py
首先,在Django工程的settings.py文件中加入如下配置代碼:
import djcelery djcelery.setup_loader() BROKER_URL= 'amqp://guest@localhost//' CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
其中,當djcelery.setup_loader()運行時,Celery便會去查看INSTALLD_APPS下包含的所有app目錄中的tasks.py文件,找到標記為task的方法,將它們注冊為celery task。BROKER_URL和CELERY_RESULT_BACKEND分別指代你的Broker的代理地址以及Backend(result store)數據存儲地址。在Django中如果沒有設置backend,會使用其默認的后臺數據庫用來存儲數據。注意,此處backend的設置是通過關鍵字CELERY_RESULT_BACKEND來配置,與一般的.py文件中實現celery的backend設置方式有所不同。一般的.py中是直接通過設置backend關鍵字來配置,如下所示:
app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
然后,在INSTALLED_APPS中加入djcelery:
INSTALLED_APPS = ( …… 'qv', 'djcelery' …… )
4. 在要使用該任務隊列的app根目錄下(比如qv),建立tasks.py,比如:
在tasks.py中我們就可以編碼實現我們需要執行的任務邏輯,在開始處import task,然后在要執行的任務方法開頭用上裝飾器@task。需要注意的是,與一般的.py中實現celery不同,tasks.py必須建在各app的根目錄下,且不能隨意命名。
5. 生產任務
在需要執行該任務的View中,通過build_job.delay的方式來創建任務,并送入消息隊列。比如:
6. 啟動worker的命令
#先啟動服務器 python manage.py runserver #再啟動worker python manage.py celery worker -c 4 --loglevel=info
四、補充
Django下要查看其他celery的命令,包括參數配置、啟動多worker進程的方式都可以通過python manage.py celery --help來查看:
另外,Celery提供了一個工具flower,將各個任務的執行情況、各個worker的健康狀態進行監控并以可視化的方式展現,如下圖所示:
Django下實現的方式如下:
1. 安裝flower:
pip install flower
2. 啟動flower(默認會啟動一個webserver,端口為5555):
python manage.py celery flower
3. 進入http://localhost:5555即可查看。
上述就是小編為大家分享的如何在Django中使用Celery異步任務隊列了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。