Как запустить задачу Celery, когда Django закончил запуск - PullRequest
0 голосов
/ 08 мая 2018

У меня конфигурация сельдерея с Django. И я ищу способ запуска задачи, которая должна выполняться в течение всего цикла запуска приложения. В этом случае я использую Celery worker или есть какие-то другие варианты запуска такой длительной задачи параллельно с сервером Django?

Также я хочу иметь возможность получить доступ к базе данных из задачи и контролировать ее с помощью supervisord в случае, если она не сможет перезапустить ее.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Я вижу два вопроса:

Как запустить задачу сельдерея, когда django закончил запуск

См. Пункт 2 ниже, но прежде, см. 0 и 1.

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

Как не существует прецедент, я вижу три интерпретации:

-0. Как запустить сельдерей вместе с runserver или uwsgi, gunicorn, mod_wsgi и т. Д.

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

  1. Как обеспечить доступность сельдерея для запуска задачи во время цикла запроса / ответа django.

После того, как вы запустите задачу сельдерея с супервизором, и вам потребуется запускать задачу при каждом запросе / ответе, используйте Сигналы запроса / ответа , чтобы вызвать функцию с соответствующим декоратором сельдерея @task.

  1. Как сохранить задачу celery во время основного процесса python, который обслуживает запрос / ответ, активным, другими словами, так как демон python начинается, пока не закончится, как, например, до тех пор, пока python manage.py runserver не будет запущен, пока python manage.py runserver прекращено. (это отличается от пункта № 1, поскольку один python manage.py runserver отвечает за обслуживание N запроса / ответа).

Для меня это звучит как длинный пул, и давайте предположим, что вы хотите измерить, как долго приложение работало, потому что вы можете считать секунды с момента его запуска до его окончания, обычно эти случаи обрабатываются с помощью других стратегий, таких как анализ Журналы приложений, но в любом случае, если это так, у вас все время будет занят занятый сельдерей. Обычно это возможный неправильный шаблон, но случай использования - это случай использования, поэтому точкой входа в веб-приложение является файл wsgi, а точкой выхода - системный сигнал SIGINT, прочитайте этот вопрос .

Мое намерение не путать, это указать, что этот вопрос можно интерпретировать по-разному, в любом случае, у каждого есть ответ.

0 голосов
/ 26 октября 2018

В вашем supervisord.ini

[group:yourproject-staging]
programs=yourproject-staging-uwsgi,yourproject-staging-celery


[program:yourproject-staging-uwsgi]
command=/data/www/yourproject-staging/bin/uwsgi --ini /data/www/yourproject-staging/conf/yourproject.staging.uwsgi.ini
user=www-data
autostart=true
autorestart=true
startsecs=5
priority=1100
killasgroup=true



[program:yourproject-staging-celery]
command=/data/www/yourproject-staging/bin/celery -A yourproject worker --loglevel=INFO
directory=/data/www/yourproject-staging
environment=E=staging
user=www-data
autostart=true
autorestart=true
startretries=2
exitcodes=0
stopasgroup=true
killasgroup=true
startsecs=5
priority=850
stdout_logfile=/data/log/yourproject-staging/celery_worker.log
stderr_logfile=/data/log/yourproject-staging/celery_error.log

Это запустит вашего сельдерея в промежуточную среду.

Проверьте, установили ли вы Redis, потому что я этого не сделал и застрял на пару часов.

0 голосов
/ 25 октября 2018

Вы можете запустить сельдерей в качестве фонового задания, как описано здесь .Кроме того, при развертывании вам нужно будет запустить два модуля (в одной системе будет запущен celery, а в другом приложении django), и необходимо настроить перезапуск после развертывания чего-либо.Таким образом, если ваши фоновые задания потребляют больше памяти или что-то еще, это не должно влиять на приложение.

Для запуска задачи параллельно с вашим приложением вы можете запустить задание по расписанию, которое проверяет событие, скажем, каждую минутуи выполняет работу, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...