Django異步任務之Celery


Celery

celery 是一個用於實現異步任務的庫, 在很多項目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在實現 http request請求返回 view 前做一些我們想做的而且耗時的事情而不會讓用戶等待太久

環境

django 版本 == 1.11.6

celery 版本 == 3.1.25

安裝

pip install django-celery
pip install celery

 

首先需要將 celery 添加到 django 項目的 settings 里, celery 任務和 django 需要一個 中間人(broker),,這里使用的是 django 自帶的 broker, 但在生產中一般使用 rabbitmq, Redis 等,在 INSTALLED_APP 中需要添加 djcelery 和 kombu.transport.django, 還有 app 應用。

- project/project/ settings.py:

import djcelery

djcelery.setup_loader() 
BROKER_URL = 'django://'

INSTALLED_APP = (
    ...
    'app'
    'djcelery',
    'kombu.transport.django',
)

新建 celery.py 創建一個 celery 應用,並添加以下內容

- project/project/ celery.py:

# 相對路徑導入, 防止導入 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')
# 創建一個 celery 應用
app = Celery('project')

# 導入配置
app.config_from_object('django.conf:settings')
# 自動發現 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:

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 中添加任務,文件名必須是 tasks.py, 在普通 python 函數前加一個 @task() 裝飾器就變成了 celery task

project/app/ tasks.py:

from celery.task import task
from time import sleep

@task()
def helloWorld():
    print 'helloWorld'
    sleep(10)
    print 'helloWorld'
    return 'helloCelery'

這樣,一個任務就創建成功了,只剩下在 view 中調用了

project/app view.py:

from tasks.py import helloWorld

def home():

    helloWorld.delay()

    return HttpResponse('helloCelery')

最后

python manage.py migrate

 


免責聲明!

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



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