celery
情景:用戶發起request,並等待response返回。在本些views中,可能需要執行一段耗時的程序,那么用戶就會等待很長時間,造成不好的用戶體驗,比如發送郵件、手機驗證碼等。
使用celery后,情況就不一樣了。解決:將耗時的程序放到celery中執行。
- 點擊查看celery官方網站
- 點擊查看celery中文文檔
celery名詞:
- 任務task:就是一個Python函數。
- 隊列queue:將需要執行的任務加入到隊列中。
- 工人worker:在一個新進程中,負責執行隊列中的任務。
- 代理人broker:負責調度,在布置環境中使用redis。
1 首先在運行django框架的環境當中安裝:
celery==3.1.25 django-celery==3.1.17
2 在項目的settings.py中進行如下配置
注冊app中添加djcelery
INSTALLED_APPS = ( ... 'djcelery', }
配置任務代理和任務模塊
import djcelery djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/2'
這里 reids是存放任務的隊列。要確保環境中有redis服務
3 在應用目錄下建立一個任務tasts.py文件 里面寫下任務函數
1 import time 2 from celery import task 3
4 @task 5 def sayhello(): 6 print('hello ...') 7 time.sleep(2) 8 print('world ...')
這里將函數用task裝飾之后,django就會在我們的模塊中找,如果這個函數被調用的時候,就自動添加到celery隊列當中,隊列幫我們執行
4 在視圖當中調用
from booktest import tasks ... def sayhello(request): # print('hello ...')
# time.sleep(2)
# print('world ...')
tasks.sayhello.delay() return HttpResponse("hello world")
切記要引入剛剛任務文件,
並且調用的時候不能直接調用,要任務函數.delay() 進行調用
如果任務函數要參數,則將參數表傳給delay()
5 執行遷移
python manage.py migrate
6 啟用redis服務器
sudo service redis start
7 啟動celery的worker
python manage.py celery worker --loglevel=info
在這之后,可以運行我們的功能模塊,當任務函數被調用的時候,就會送進celery隊列,有celery幫我們托管調度。不會阻塞我們的主線程~