Как запустить повторяющуюся задачу в фреймворке Python?

Я создаю веб-сайт, который предоставляет посетителям некоторую информацию. Эта информация агрегируется в фоновом режиме путем опроса нескольких внешних API каждые 5 секунд. Теперь я работаю над тем, что я использую задания APScheduler . Сначала я предпочел APScheduler, потому что он упрощает работу всей системы (поскольку мне не нужно задавать задания cron на новой машине). Я запускаю функции голосования следующим образом:

from apscheduler.scheduler import Scheduler @app.before_first_request def initialize(): apsched = Scheduler() apsched.start() apsched.add_interval_job(checkFirstAPI, seconds=5) apsched.add_interval_job(checkSecondAPI, seconds=5) apsched.add_interval_job(checkThirdAPI, seconds=5) 

Этот вид работает, но есть некоторые проблемы с ним:

  1. Во-первых, это означает, что интервальные задания выполняются за пределами контекста Flask. До сих пор это не было большой проблемой, но когда вы вызываете конечную точку, я хочу, чтобы система отправила мне электронное письмо (говоря «эй, вызвав API X не удалось»). Тем не менее, он не работает в контексте Flask, он жалуется, что флеш-почта не может быть выполнена ( RuntimeError('working outside of application context') ).
  2. Во-вторых, мне интересно, как это будет вести себя, когда я больше не использую встроенный отладочный сервер Flask, а производственный сервер с разрешением 4 рабочих. Будет ли она начинать каждую работу четыре раза?

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

[EDIT] Я только что читал о сельдере с его графиками . Хотя я действительно не вижу, как сельдерей отличается от APScheduler и может ли он таким образом решить мои две точки, мне интересно, читает ли кто-нибудь, что я должен исследовать больше в сельдере?

[ЗАКЛЮЧЕНИЕ] Примерно через два года я читаю это, и я подумал, что могу дать вам понять, что я закончил. Я понял, что @BluePeppers прав, говоря, что я не должен так тесно привязываться к экосистеме Flask. Поэтому я выбрал регулярные задания cron, выполняемые каждую минуту, которые устанавливаются с использованием Ansible. Хотя это делает его немного сложнее (мне нужно было изучить Ansible и преобразовать какой-то код, чтобы его можно было запускать каждую минуту). Я думаю, что это более надежный. В настоящее время я использую awesome pythonr-rq для очередей заданий a-sync (проверка API и отправка писем). Я только что узнал о rq-планировщике . Я еще не тестировал его, но, похоже, именно то, что мне нужно, в первую очередь. Так что, возможно, это подсказка для будущих читателей этого вопроса.

Для остальных я просто желаю вам прекрасного дня!

One Solution collect form web for “Как запустить повторяющуюся задачу в фреймворке Python?”

(1)

Контекстный менеджер app.app_context() можно использовать для настройки контекста приложения. Я предполагаю, что использование будет выглядеть примерно так:

 from apscheduler.scheduler import Scheduler def checkSecondApi(): with app.app_context(): # Do whatever you were doing to check the second API @app.before_first_request def initialize(): apsched = Scheduler() apsched.start() apsched.add_interval_job(checkFirstAPI, seconds=5) apsched.add_interval_job(checkSecondAPI, seconds=5) apsched.add_interval_job(checkThirdAPI, seconds=5) 

Кроме того, вы можете использовать декоратор

 def with_application_context(app): def inner(func): @functools.wraps(func) def wrapper(*args, **kwargs): with app.app_context(): return func(*args, **kwargs) return wrapper return inner @with_application_context(app) def checkFirstAPI(): # Check the first API as before 

(2)

Да, это все равно будет работать. Единственная (значительная) разница заключается в том, что ваше приложение не будет напрямую общаться с миром; он будет проходить через обратный прокси-сервер или что-то через fastcgi / uwsgi / whatever. Единственное беспокойство заключается в том, что если у вас запущено несколько экземпляров приложения, будут созданы несколько планировщиков. Чтобы справиться с этим, я предлагаю вам переместить свои backend-задачи из приложения Flask и использовать инструмент, предназначенный для регулярного выполнения задач (например, Celery). Недостатком этого является то, что вы не сможете использовать такие вещи, как Flask-Mail, но imo, не слишком хорошо быть настолько тесно связанными с экосистемой Flask; что вы получаете, используя Flask-Mail над стандартной, не флягой, почтовой библиотекой?

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

  • колбочное поле на колбе
  • Flask: загрузите файл csv при нажатии кнопки
  • Flask url_for URL в Javascript
  • Команда "py.test" против "pytest"
  • Каков наилучший способ получить полуночный уникальный идентификатор (не последовательный) для объектов базы данных
  • jinja2 установить фоновое изображение
  • Развертывание приложения Python Flask на Apache с версией Python, установленной только в виртуальной среде
  • Flask - процесс WSGI продолжает сбой
  •  
    Interesting Posts for Van-Lav

    Формат Python timedelta для строки

    Как выполнить мою программу, если она встречает None в ее параметре в python

    распознавание речи уменьшает возможные результаты поиска

    как сказать pylint игнорировать определенные импортные товары?

    hex <-> RGB <-> Преобразование цветового пространства в HSV с помощью Python

    Как можно указать или добавить каталог в путь поиска Python.h во время сборки / установки модуля с помощью setup.py?

    Проблема с установкой Python 2.7.8 наряду с 2.7.5 на RHEL 7.2

    Как обнаружить Рождественскую елку?

    Подсчитав наибольшую последовательность четных чисел

    PHP-вызов скрипта Python и сценарий python не могут записываться в файл

    Преобразование JSON в CSV с использованием Python (Idle)

    Ограничения каталога TEMP в Windows?

    В Python, как я прокручиваю словарь и изменяю значение, если оно что-то равняется?

    Разбор HTML Бесконечный свиток

    как написать словарь с одним ключом нескольких значений в файл csv

    Python - лучший язык программирования в мире.