Celery + Redis を使ってDjangoでタスクキューを実装する
[公式ドキュメント](http://docs.celeryproject.org/en/latest/django/index.html)を参考にしつつ作業した時のメモ。 --- ## インストール Celery本体 # pip install celery redis-py # pip install redis django-celery # pip install django-celery pytz # pip install pytz Celeryでタイムゾーンを扱う時に必要。 3.0から CELERY_ENABLE_UTC がデフォルトで有効化されてるらしい。 CELERY_TIMEZONE設定でタイムゾーンを利用する場合はpytzが必要 --- ## 設定 DjangoプロジェクトでCeleryを利用できるように以下の作業を実施 ### settings.pyの編集 setup処理を組み込む import djcelery djcelery.setup_loader() INSTALLED_APPSにdjceleryを追加 INSTALLED_APPS += ("djcelery", ) バックエンドを設定 [利用するバックエンドのドキュメントはここにある。](http://docs.celeryproject.org/en/latest/configuration.html) 今回はredisを使うのでドキュメントを参考にしつつ、以下のようにとりあえず最低限の設定。 # タイムゾーンの設定 CELERY_ENABLE_UTC = True #使わない時はFalseにする。 CELERY_TIMEZONE = "Asia/Tokyo" # タスクの状態と結果を格納するバックエンドをRedisに設定。 # 設定していなければ結果が受け取れない CELERY_RESULT_BACKEND = "redis://" # ブローカーに関する設定 BROKER_URL = "redis://" ### mod_wsgiを利用している場合 wsgiモジュールにsetup処理を組み込む。 import djcelery djcelery.setup_loader() --- ## 使ってみる。 ### workerを起動する brokerにRedisを利用しているので、Redisは事前に起動しておく。 Django1.4からデフォルトのプロジェクトディレクトリが変更され、workerに明示的にsettingsを指定しないとエラーになった。 > python manage.py celery worker --settings=settings ### tasks.pyを定義する django-eleryはINSTALLED_APPS に登録されているアプリ以下にあるtasks.pyを自動で検索してくれる。 なのでtasks.pyを作成して処理はそこに記述する方法が一般的。 from celery import task @task() def add(x, y): return x + y ### 実際に動作するかテスト #### タスクを実行 workerを起動させている状態で、djangoのshellからテスト実行。 > python manage.py shell # tasks.pyに作成した関数 from hoge.tasks import add result = add.delay(1,2) result.ready True result.get() 3 #### redisコマンドから確認 デフォルトではキュー名の先頭にceleryが付くので、keyを検索してみる。 redis-cli keys celery* 1) "celery-task-meta-f2ac970e-fa4c-412f-a959-8d94e086d77f" 2) "celery-task-meta-708dfb88-835a-465d-9a44-92879f1732a4" 3) "celery-task-meta-b2839e25-4cda-4353-b5e2-42a750ef3782" 4) "celery-task-meta-85a23303-3906-4278-ab3c-d459b73c5ae8"











