Как и обещал, пиши мануал по настройке django-celery. Так как статья для новичкаов в качесте брокера будет использован django-kombu, т.к. он требует минимум настройки и очень прост в использование. Вся настройка производиться на ОС Ubuntu 10.04.
Ну, что ж начнем. Надеюсь Вы ужже создали django проэкт, если же нет, то сделайте это. А теперь по пунктам.
1) Ставим необходимые пакеты:
pip install celery django-celery django-kombu
2) Конфигурация settings.py:
import djcelery
djcelery.setup_loader()
CELERYBEAT_SCHEDULER="djcelery.schedulers.DatabaseScheduler"
CELERY_ALWAYS_EAGER=False
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
INSTALLED_APPS = (
...
'djcelery',
'djkombu',
)
3) Выполняем миграцию бд
./maanage.py syncdb
Если Вы используете south, то надо выполнить миграцию
./manage.py migrate djcelery
4) Создаем файлик tasks.py(на одном уровне с settings.py или в любом приложении)
from celery.task import periodic_task
from datetime import timedelta
@periodic_task(run_every = timedelta(seconds = 60))
def test():
print "is works!"
функция test будет выпрлняться каждые 60 секунд. Она просто выводит строку и больше нечего не делает, но для проверки работоспособности этого хватит.
5) Запускаем сервер Celery
./manage.py celeryd -l INFO -B
-l INFO
это лог левел, а флаг -B
нужен для переодических заданий. Должно вывести такое:
-------------- celery@30011820 v3.0.13 (Chiastic Slide)
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: djkombu.transport.DatabaseTransport://localhost//
- ** ---------- . app: default:0x8c0f36c (djcelery.loaders.DjangoLoader)
- ** ---------- . concurrency: 1 (processes)
- ** ---------- . events: OFF (enable -E to monitor this worker)
- ** ----------
- *** --- * --- [Queues]
-- ******* ---- . celery: exchange:celery(direct) binding:celery
--- ***** -----
[Tasks]
.myapp.tasks.test
[2013-01-24 07:12:15,130: INFO/Beat] Celerybeat: Starting...
[2013-01-24 07:12:15,134: INFO/Beat] Writing entries...
[2013-01-24 07:12:15,202: INFO/Beat] Scheduler: Sending due task base.tasks.test (base.tasks.test)
[2013-01-24 07:12:15,212: INFO/Beat] Writing entries...
[2013-01-24 07:12:15,320: WARNING/MainProcess] /home/django/space/env/lib/python2.6/site-packages/djcelery/loaders.py:132: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warnings.warn("Using settings.DEBUG leads to a memory leak, never "
[2013-01-24 07:12:15,320: WARNING/MainProcess] celery@30011820 ready.
[2013-01-24 07:12:15,322: INFO/MainProcess] consumer: Connected to djkombu.transport.DatabaseTransport://localhost//.
[2013-01-24 07:12:15,347: INFO/MainProcess] Got task from broker: base.tasks.test[61d16254-0f0f-49a6-a90d-71abf972f782]
[2013-01-24 07:12:15,551: INFO/MainProcess] child process calling self.run()
[2013-01-24 07:12:15,666: WARNING/PoolWorker-2] is works!
Как видно из последней строчки все работает:)
Также можно настроить worker server в виде демона, но это уже другая тема.
6) Настройка redis в качестве брокера. Устанавливаем redis из исходников.
# скачиваем и разархивируем ( смотрим на https://code.google.com/p/redis/downloads/list последнию версию)
wget http://redis.googlecode.com/files/redis-2.6.9.tar.gz
tar -zxvf redis-2.6.9.tar.gz
# устанрвка
cd redis-2.6.9
sudo make
sudo make test
sudo make install
# установка сервера
cd utils
sudo ./install_server.sh
# проверка роботоспособности
redis-cli
7) Установка необходимых пакетов
pip install celery-with-redis
8) Конфигурация. settings.py`
import djcelery
djcelery.setup_loader()
BROKER_HOST = "localhost"
BROKER_BACKEND="redis"
REDIS_PORT=6379
REDIS_HOST = "localhost"
BROKER_USER = ""
BROKER_PASSWORD =""
BROKER_VHOST = "0"
REDIS_DB = 0
REDIS_CONNECT_RETRY = True
CELERY_SEND_EVENTS=True
CELERY_RESULT_BACKEND='redis'
CELERY_TASK_RESULT_EXPIRES = 10
CELERYBEAT_SCHEDULER="djcelery.schedulers.DatabaseScheduler"
CELERY_ALWAYS_EAGER=False
INSTALLED_APPS = (
...
'djcelery',
)
Дальше выполняем syncdb/migration
.
P.S. На продакшене рекомендую в качестве брокера ставить redis или rabbitmq, т.к. kombu при больших нагрузках может вызывать задержки.