django-celeryをさわってみたメモ
設定
1. Django Projectを作る
PycharmのMenu->New Projectで
ApplicationNameも聞かれるので、startappも同時にできます
2. settings.pyの編集
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'celerytest', 'djcelery' )
import djcelery
djcelery.setup_loader()
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'djcelery-sample', # Or path to database file if using sqlite3. 'USER': 'user', # Not used with sqlite3. 'PASSWORD': 'pass', # Not used with sqlite3. 'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '3306' # Set to empty string for default. Not used with sqlite3. } }
3. syncdb
pycharmから実行できます
celerytest.tasks.py
from celery import task @task() def add(x, y): return x + y
5. celeryの起動
pycharmからceleryを実行できるんですが、
残念なことにworkerとかのパラメータを渡せないのでコマンドラインで起動
python manage.py celery worker --loglevel=info
6. 試してみる
pycharmからRun Django Consoleを実行して確認してみます。
実行できましたが、AsyncResult.readyを呼び出すとエラーになりました。
ドキュメントによると結果を受け取るにはbackendの設定が必要
CELERY_RESULT_BACKEND = "amqp"
コンソールから試してみたところ、AsyncResult.readyが呼び出せるようになった。
$ python manage.py shell Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) Type "copyright", "credits" or "license" for more information. IPython 0.12.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: from celerytest import tasks In [2]: result = tasks.add.delay(3,3) In [3]: result.ready() Out[3]: True In [4]: result.backend Out[4]: <celery.backends.amqp.AMQPBackend at 0x1022a8c10>
Pycharm上のRun Django Consoleだと設定をしても有効にならなかったので、なにかmanage.py shellとは違う動きをしているのかもしれない。もうちょっと調べる。
(Pycharm上のConsoleだとDisabledBackendが設定されてしまう。
taskを呼び出す前にfrom django.conf import settings; settings.CELERY_RESULT_BACKEND;で値を参照しておくと、backendにAMQPBackendが使用されるというよくわからない挙動)