Celery を Django と Redis で使う

メッセージキューやりたくなったので

環境

インストール

django, celery, redis のセットで使う場合のパッケージ
$pip install django-celery-with-redis
redis
$sudo yum install redis

設定

redis起動
$sudo /etc/init.d/redis start
settings.pyに追記
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis'

BROKER_TRANSPORTにdjangoも指定できるっぽいので
開発環境ではこちらの設定を適用できるようにしておくのも、ありかも

syncdb

south環境の場合はmigrate

$ python manage.py migrate djcelery
process起動
$ python manage.py celeryd --loglevel=info

テスト

サンプルどおりのテストプロジェクトを作ってためしてみる

startapp
$ python manage.py startapp celerytest
tasks.py作成
$ vim celerytest/tasks.py

tasks.py

from celery.task import task

@task
def add(x, y):
    return x + y
APPSに追記
$ vim settings.py

settings.py

INSTALLED_APPS = (
..
    'celerytest',
)
task実行してみる
$ python manage.py shell
>>> from celerytest.tasks import add
>>> result = add.delay(2, 2)
>>> result
<AsyncResult: 08af09fa-1d18-4891-86dd-17b18d323225>
>>> result.result
4
>>> result.successful()
True

キュー実行されてる

Djangoの管理画面からタスク状況見る

celerycam を起動させとくとsnapshotを保存してくれて、adminで閲覧できるようになる
https://groups.google.com/group/celery-users/browse_thread/thread/5e9a12f595ae5f67

$ python manage.py celeryd -E --loglevel=DEBUG
$ python manage.py celerycam --loglevel=DEBUG

adminのdjcelery -> Tasks に表示される
celeryd を -E で起動しておかないと記録されないので注意

Unit Test

このままだと、python manage.py test したときにもCelery にタスクが投げられてテストが通らなくなったりする

そんなときは settings.py に以下の設定を追加ればいい

CELERY_ALWAYS_EAGER = True

http://ask.github.com/django-celery/cookbook/unit-testing.html

どうやら

いろいろ設定オプションやらなんやらある模様

Brokerをredisにするとdata lostの可能性があるよ的なことが書いてあったけど
とりあえず何も考えなくてよかったのでとっかかりredisにしてみました

celery的にはとりあえずrabbitmq使っとけ、って感じらしいけど

http://celery.readthedocs.org/en/latest/getting-started/first-steps-with-celery.html#choosing-your-broker


そのへんのことはいろいろおいおいしらべてく