在Django中使用celery整理

    上一片博客記錄瞭如何入門級的使用celery,這裏記錄的是如何在Django框架中使用celerypython

快速開始

    首先假設你的Django項目是這樣的redis

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

而後在你的項目下面建立celery.py文件,proj/proj/celery.py,以後就能夠在裏面寫你須要執行的task任務函數django

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# 設置Django的settings目錄
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj'
             broker='amqp://',
             backend='amqp://')

# 這裏聲明的是和celery相關的配置命名必須是以CELERY開頭的,這關於上一片博客的配置方法第三種
app.config_from_object('django.conf:settings', namespace='CELERY')

# 這裏聲明的是自動加載全部在django settings裏面註冊的app下面的tasks.py
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

在第一行中的from __future__ import absolute_import, unicode_literals,是聲明接下來的導入都是絕對路徑的導入,防止在導入celery的時候出現衝突app

以後就能夠在你的proj/proj/__init__.py文件下面註冊你的celery了框架

from __future__ import absolute_import, unicode_literals

# 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

__all__ = ('celery_app',)

上面的英文意思是這確保了你的django啓動的時候celery的app對象一直被導入狀態,當你使用shared_task裝飾器裝飾的task函數的是就會使用這個app對象,接下來配合上面的app.autodiscover_tasks()一塊兒說明,上面聲明瞭app.autodiscover_tasks會加載全部app下全部的task,假設你的目錄結構以下函數

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

接下來你就能夠使用shared_task,在tasks.py文件中this

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

這個shared_task就確保了你的__init__.py下聲明的celery_app就會在這裏被使用,而不須要重複聲明。url

前臺啓動celery

celery worker -A proj -l info

後臺啓動celery

celery multi start w1 -A proj -l info

重啓spa

celery  multi restart w1 -A proj -l info

中止debug

celery multi stop w1 -A proj -l info

補充

你除了能夠用redis做爲celery的代理以外還能夠使用django自帶的orm/cache

首先安裝拓展

pip install django-celery-results

在Django設置的installed下面添加

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

執行

python manage.py migrate celery_results

若是你使用了django的settings做爲celery配置文件

添加

CELERY_RESULT_BACKEND = 'django-db'

CELERY_CACHE_BACKEND = 'django-cache'
相關文章
相關標籤/搜索