Справочный работник с колбой
У меня есть webapp, который построен на python/Flask и имеет соответствующее фоновое задание, которое выполняется непрерывно, периодически опроса для данных для каждого зарегистрированного пользователя.
Мне бы хотелось, чтобы эта фоновая работа начиналась, когда система запускается и продолжает работать, пока она не выключится. Вместо того, чтобы создавать сценарии /etc/rc.d, у меня просто появилось приложение флэша, которое запускает новый процесс (используя модуль многопроцессорности).
Итак, с этой настройкой мне нужно только развернуть приложение Flask, и он также запустит фоновый рабочий.
Каковы недостатки этого? Это полный и полный хак, который в некотором роде хрупок или хороший способ настроить webapp с соответствующей фоновой задачей?
Ответы
Ответ 1
Попробуйте flask-celery. Это среда для запуска отложенных, фоновых или распределенных задач. Для этого требуется брокерское приложение: обычно используется RabbitMQ, но вы можете использовать имеющуюся у вас базу данных, см. проект Celery.
Использование его так же просто: создать рабочий модуль
from celery.tasks import task
@task
def add(x, y):
return x + y
Настройка:
# celeryconfig.py
# (for RabbitMQ)
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
Запустите фоновый процесс:
$ celeryd -l info -I tasks,handlers
Вызов с задержкой:
>>> from tasks import add
>>> add.delay(4, 4)
<AsyncResult: 889143a6-39a2-4e52-837b-d80d33efb22d>
(прочитать учебник далее)
Ответ 2
Недостатком вашего подхода является то, что есть много способов, с помощью которых он может потерпеть неудачу, особенно вокруг остановки и перезапуска приложения с флягой.
- Вам придется иметь дело с грациозным отключением, чтобы дать вашему работнику возможность завершить свою текущую задачу.
- Когда-нибудь ваш работник не остановится вовремя и может задерживаться, пока вы запускаете другой, когда вы перезагружаете приложение с флягой.
Вот несколько советов, которые я бы предложил в зависимости от ваших ограничений:
script + crontab
Вам нужно только написать script, который выполняет любую задачу, и cron
позаботится о ее запуске каждые несколько минут. Преимущества: cron
будет периодически запускать его для вас и запускаться при запуске системы. Недостатки: если задача занимает слишком много времени, вы можете одновременно запускать несколько экземпляров вашего script. Вы можете найти некоторые решения для этой проблемы здесь.
supervisord
supervisord
- это аккуратный способ справиться с различными демонами. Вы можете настроить его для запуска своего приложения, фона script или и, и запустить их с сервера. Единственным недостатком является то, что вам нужно установить supervisord
и убедиться, что его демон запущен при запуске сервера.
uwsgi
uwsgi
- очень распространенный способ развертывания фляжных приложений. Он имеет несколько функций, которые могут оказаться полезными для управления фоновыми работниками.
Сельдерей
Celery - это асинхронная очередь очереди задач/заданий на основе распределенной передачи сообщений. Он ориентирован на работу в режиме реального времени, но также поддерживает планирование. Я думаю, что это лучшее решение для планирования фоновых задач для флеш-приложения или любого другого приложения на основе python. Но использование этого происходит с некоторой дополнительной массой. Вы будете внедрять по крайней мере следующие процессы:
- брокер (rabbitmq или redis)
- рабочий
- планировщик
Вы также можете получить supervisord
для управления всеми описанными выше процессами и запускать их при запуске сервера.
Заключение
В вашем стремлении сократить количество процессов я бы настоятельно предложил решение на основе crontab
, поскольку оно может дать вам долгий путь. Но, пожалуйста, убедитесь, что ваш фон script оставляет след выполнения или журналы какого-то типа.