有時候我們?Django?的視圖中會有一些執(zhí)行比較耗時的任務(wù)(例如收發(fā)郵件)?和?后臺任務(wù)(例如爬蟲和更新服務(wù)器緩存).
Celery?是 Python?開發(fā)分布式任務(wù)列隊的處理庫. 可以異步分布式地異步處理任務(wù),?也可定時執(zhí)行任務(wù)等等.下面介紹一個 Celery的簡單案例.
Celery?方式的選擇.
這里 Celery?的中間人,?我采用 Redis.?安裝 Redis.
這里還需要安裝 celery-with-redis --> pip install celery-with-redis.
該命令會自動安裝 redis(python庫)、celery、kombu、billiard、amqp、vine和celery-with-redis相關(guān)庫.?這里安裝的 redis?是 python?操作 redis?的庫,?非 redis?庫. redis?數(shù)據(jù)庫需要獨立安裝.
為了測試, views.py?寫了一個耗時方法,?和一個響應(yīng) json?方法.
編寫對應(yīng)路由訪問 index?視圖?看一下響應(yīng)速度.?中間有個10秒等待.
注:?這邊 Student.objects.values()?得到的是一個類字典查詢集類,?你要把他轉(zhuǎn)化成字典列表才能進行 json.dumps()?操作進而轉(zhuǎn)化成字符串在瀏覽器格式化輸出.
下面的 celery?版本是 3.1.25? ? celery 4.x可能不同.
打開 settings.py?所在文件夾,?新建 celery.py?文件.
這個文件還沒被加載,?接著打開 settings.py?同目錄下的 __init__.py 文件.?讓運行該 Django?項目的時候,?加載改文件配置 Celery.
還需在 settings.py?中設(shè)置 celery,?尤其是中間人的設(shè)置.?若不設(shè)置中間人,會提示無法連接中間人的錯誤.?
把耗時任務(wù)丟給 celery?去處理.
上面的 views.py?有個耗時任務(wù) send.?在 myapp?應(yīng)用下新建 task.py?文件,?將 send?方法剪切到該文件中并定義為 celery?任務(wù).
在原有的方法上加上 celery?裝飾器 task.?也可以通過前面添加的 celery_app?給 send?方法加裝飾器。 (views.py?文件中)
原來的 index 視圖函數(shù)修改為:
本地啟動 celery?并測試.
啟動 celery?之前,?確保已經(jīng)安裝 redis?并啟動 redis?服務(wù).?
redis?安裝過程 : -->?http://yshblog.com/blog/155
接著,?啟動 celery worker.?這個 worker?是用于異步執(zhí)行任務(wù)的 "工作者".?進去 manage.py?文件所在目錄,?執(zhí)行如下命令:
Celery -A myproject(項目名) worker -l(英文字母L的小寫) info
在啟動 Django?服務(wù)器 python manage.py runserver?看一下響應(yīng)時間.