Django 使用celery任務隊列的配置


celery

情景:用戶發起request,並等待response返回。在本些views中,可能需要執行一段耗時的程序,那么用戶就會等待很長時間,造成不好的用戶體驗,比如發送郵件、手機驗證碼等。

使用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幫我們托管調度。不會阻塞我們的主線程~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM