Справочный работник с колбой

У меня есть 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 оставляет след выполнения или журналы какого-то типа.