Какой самый элегантный способ запустить celeryd в проекте Django?

Я начинаю с Celery в моем проекте Django и не могу не задаться вопросом: что является самым элегантным способом начать работу с сельдереем для проекта?

Позвольте мне объяснить причины этого вопроса.

В настоящее время рекомендуемый способ начать сельдерей, по-видимому, python manage.py celeryd в более простых настройках и что-то в строках /etc/init.d/celeryd start в более сложных. Однако в первом случае этот процесс кажется хрупким, так как процесс не запускается автоматически, а второй требует довольно небольшой конфигурации по проекту (virtualenv, settings и т.д.). Особенно последнее демонстрирует мое общее чувство что работник сельдерей - это нечто глубоко привязанное к его кодовой базе, а также глубоко привязанное к основному проектному процессу, поскольку работник сельдерей, не имеющий ничего, чтобы фактически создавать задачи в нем, практически бесполезен (за одним исключением является celerybeat). Еще одна проблема с сценариями init.d заключается в том, что им понадобится усовершенствованная логика для обработки нескольких проектов на сервер (с отдельными виртуальными средами, настройками, путями и т.д.).

Итак, я понял, может быть довольно элегантно конфигурировать, чтобы начать celeryd вместе с моим основным процессом, например. создайте его с mod_wsgi с помощью Apache (аналогично другим настройкам) и, таким образом, убейте его, когда основной процесс опустится (/etc/init.d/apache2 stop). Тем не менее, я не совсем уверен, есть ли какие-либо технические ловушки, рассматривающие производительность и/или безопасность в этом рассуждении, - это может быть так, потому что я попытался разобраться в этом и ничего не нашел.

  • Разве мои рассуждения ошибочны, учитывая архитектуру сельдерея?
  • Могу ли я каким-либо образом создать celeryd где-то в пределах mod_wsgi и разумно ли это?
  • Как вы начинаете работу с сельдереем в ваших проектах?
1 ответ

Я начинаю сельдерей, используя manage.py celeryd и управляя этим с помощью супервизора. В каждом развертывании, которое модифицирует задачу, я просто перезапускаю сельдерей после развертывания и перезапуска apache.\

Edit:

Мы используем шеф-повара для управления нашими конфигурациями для супервизора и других процессов, поэтому это может быть чуть-чуть убито. У нас есть один master supervisord.conf, который включает отдельный файл конфигурации для каждого сайта, который мы запускаем. Один из них может выглядеть так:

[program:celery_newproject]
command = /srv/www/.virtualenvs/newprojectenv/bin/python /srv/www/projects/newproject/manage.py celeryd --concurrency=2 --settings=settings.alpha --pidfile=/var/run/celery/celery_newproject.pid
user = wsgiuser
environment = PYTHON_EGG_CACHE="/tmp/.python-eggs"

При развертывании мы просто запускаем

sudo supervisorctl restart celery_newproject

Это перезапускает процесс супервизора для сельдерея и поднимает все новые задачи, которые вы определили.

Существуют и другие не элегантные способы сделать это. На моих личных сайтах я просто запускаю работу cron, которая проверяет наличие файла .pid и перезапускает сельдерей, если он не существует. Не очень элегантный, но он работает на сайтах с низкой надежностью.

licensed under cc by-sa 3.0 with attribution.