許多Django應(yīng)用需要執(zhí)行異步任務(wù), 以便不耽誤http request的執(zhí)行. 我們也可以選擇許多方法來完成異步任務(wù), 使用Celery是一個比較好的選擇, 因為Celery有著大量的社區(qū)支持, 能夠完美的擴(kuò)展, 和Django結(jié)合的也很好. Celery不僅能在Django中使用, 還能在其他地方被大量的使用. 因此一旦學(xué)會使用Celery, 我們可以很方便的在其他項目中使用它.
celery 是一個用于實現(xiàn)異步任務(wù)的庫, 在很多項目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在實現(xiàn) http request請求返回 view 前做一些我們想做的而且耗時的事情而不會讓用戶等待太久
環(huán)境
django 版本 == 1.11.6
celery 版本 == 3.1.25
安裝
1
2
|
pip install django-celery pip install celery |
首先需要將 celery 添加到 django 項目的 settings 里, celery 任務(wù)和 django 需要一個 中間人(broker),,這里使用的是 django 自帶的 broker, 但在生產(chǎn)中一般使用 rabbitmq, Redis 等,在 INSTALLED_APP 中需要添加 djcelery 和 kombu.transport.django, 還有 app 應(yīng)用。
- project/project/ settings.py:
1
2
3
4
5
6
7
8
9
10
11
|
import djcelery djcelery.setup_loader() BROKER_URL = 'django://' INSTALLED_APP = ( ... 'app' 'djcelery' , 'kombu.transport.django' , ) |
新建 celery.py 創(chuàng)建一個 celery 應(yīng)用,并添加以下內(nèi)容
- project/project/ celery.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 相對路徑導(dǎo)入, 防止導(dǎo)入 celery 時沖突 from __future__ import absolute_import import os from celery import Celery from django.conf import settings # 讓 celery 能找到 django 項目 os.environ.setdefault( 'DJANGO_SETTINGS_MODULE' , 'project.settings' ) # 創(chuàng)建一個 celery 應(yīng)用 app = Celery( 'project' ) # 導(dǎo)入配置 app.config_from_object( 'django.conf:settings' ) # 自動發(fā)現(xiàn) task app.autodiscover_tasks( lambda : settings.INSTALLED_APPS) @app .task(bind = True ) def debug_task( self ): print ( 'Request: {0!r}' . format ( self .request)) |
- project/project/ __init__.py:
1
2
3
4
5
|
from __future__ import absolute_import # This will make sure the app is always imported when # Django starts so that shared_task will use this app. from .celery import app as celery_app |
在 django app 中添加任務(wù),文件名必須是 tasks.py, 在普通 python 函數(shù)前加一個 @task() 裝飾器就變成了 celery task
-project/app/ tasks.py:
1
2
3
4
5
6
7
8
9
|
from celery.task import task from time import sleep @task () def helloWorld(): print 'helloWorld' sleep( 10 ) print 'helloWorld' return 'helloCelery' |
這樣,一個任務(wù)就創(chuàng)建成功了,只剩下在 view 中調(diào)用了
-project/app view.py:
1
2
3
4
5
6
7
|
from tasks.py import helloWorld def home(): helloWorld.delay() return HttpResponse( 'helloCelery' ) |
最后
1
|
python manage.py migrate |
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對服務(wù)器之家的支持。
原文鏈接:http://www.cnblogs.com/peng104/p/10580720.html