Функции задач Celery - веб-сервер против удаленного сервера

Я хочу отправлять задачи с веб-сервера (под управлением Django) на удаленную машину, на которой находится сервер Rabbitmq и несколько рабочих процессов, которые я реализовал с помощью Celery.

Если я пойду по пути Celery, похоже, мне придется разделить код между обеими машинами, что означает репликацию кода рабочей логики в коде веб-приложения.

So:

  • Есть ли лучшая практика для этого? Поскольку код является избыточным, я думаю об использовании подмодуля git (=> реплицированного в репозитории кода веб-приложения и в репозитории рабочего кода)
  • Должен ли я тогда использовать что-то еще, кроме сельдерея?
  • Я что-то упускаю?

person lajarre    schedule 18.02.2015    source источник


Ответы (2)


Один из способов справиться с этим — хранить ваших воркеров в вашем проекте django. Django и celery хорошо взаимодействуют друг с другом, позволяя вам использовать части вашего проекта django в вашем приложении celery. http://celery.readthedocs.org/en/latest/django/first-steps-with-django.html

Развертывание этого будет означать, что ваше веб-приложение не будет использовать модули, связанные с вашими работниками сельдерея, а на вашем компьютере с сельдереем ваши представления django и тому подобное никогда не будут использоваться. Обычно это приводит только к паре мегабайт неиспользуемого кода приложения django...

person dm03514    schedule 18.02.2015

Вы можете использовать send_task. Он принимает те же параметры, что и apply_async, но вам нужно только указать имя задачи. Без загрузки модуля в django можно отправлять задачи:

app.send_task('tasks.add', args=[2, 2], kwargs={})

http://celery.readthedocs.org/en/latest/reference/celery.html#celery.Celery.send_task

person ant31    schedule 21.02.2015
comment
Действительно, это то, что я искал. Тем не менее, было бы неплохо описать хорошую практику о том, как делиться именами задач (пунктирные пути к функциям задач) - person lajarre; 22.02.2015
comment
да, по умолчанию имя задачи — это полный путь к модулю Python: myproject.jobs.my_task. Вы можете переименовать его с помощью декоратора, но лично я предпочитаю значение по умолчанию. - person ant31; 23.02.2015