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使っとけ、って感じらしいけど
そのへんのことはいろいろおいおいしらべてく