Celery 3.1 を Django で使う

More than 5 years have passed since last update.

Celery は Python で非同期処理をするための Task Queue です。

Celery 3.0 までは Django で使う場合は django-celery を使いました。

Celery 3.1 からは django-celery を使わないべきとなったのでその方法を述べます。

django の準備については省略するので、必要あれば http://qiita.com/seizans/items/1dc744694c1072e2b8d3 を確認してください。


前準備


celery をインストールする

$ pip install celery


Broker を用意する

Celery で stable な Broker としているのは RabbitMQ と Redis です。(Amazon SQS なども Experimental として使える)

Redis で動作確認するとして、インストールして起動させておきます。

$ brew install redis

$ redis-server


必要事項を設定する

以下、core という名前でアプリケーションを用意している前提で設定を書きます。


settings.py

core/settings.py に以下を追加します。

BROKER_URL = 'redis://localhost'

CELERY_RESULT_BACKEND = 'redis'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']


celery.py

core/celery.py を次の内容で作成します。

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')

app = Celery('core')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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


tasks.py

from celery import shared_task

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


views.py

core/views.py に動作確認用の例として以下のようなハンドラ (と urls.py にその対応)を追加します。

from django.shortcuts import render

from .tasks import add

def hello(request):
result = add.delay(3, 8)
while not result.ready():
print 'spam'
print result.get()
return render(request, 'hello.html')


動作確認する

$ python manage.py runserver  # サーバーを起動する

$ celery -A core worker -l info # celery プロセスを起動する

を実行した後で該当 url を叩けば動作確認できるでしょう。


より詳しく

他の設定項目、API リファレンス、デーモンとしての使い方など続きは公式ドキュメントで。

http://celery.readthedocs.org/en/latest/index.html


参考