django-celeryをさわってみたメモ

django-celeryのインストール


ほんとはpycharmの設定ダイアログから入れたんだけど、pipでも同じでしょう

   pip install 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から実行できます





4. taskの定義

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が使用されるというよくわからない挙動)