Как запустить повторяющуюся задачу в среде Python Flask?
Я создаю веб-сайт, который предоставляет некоторую информацию для посетителей. Эта информация собирается в фоновом режиме, опрашивая пару внешних 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)
Это работает, но есть некоторые проблемы:
Для начала это означает, что интервальные задания выполняются вне контекста Flask. До сих пор это не было большой проблемой, но когда не удается вызвать конечную точку, я хочу, чтобы система отправила мне электронное письмо («Эй, вызов API X завершился неудачно»). Поскольку он не работает в контексте Flask, он жалуется, чтоКолба почта не может быть выполнен (RuntimeError('working outside of application context')
).Во-вторых, мне интересно, как это будет происходить, когда я больше не использую встроенный отладочный сервер Flask, а рабочий сервер с, скажем, 4 работниками. Будет ли это начинать каждую работу четыре раза?В целом я чувствую, что должен быть лучший способ выполнения этих повторяющихся задач, но я не уверен, как. У кого-нибудь есть интересное решение этой проблемы? Все советы приветствуются!
[РЕДАКТИРОВАТЬ] Я только что читал оСельдерей с этимирасписания, Хотя я на самом деле не вижу, чем Celery отличается от APScheduler и может ли он таким образом решить мои два вопроса, мне интересно, если кто-нибудь, читающий это, подумает, что я должен больше исследовать в Celery?
[ЗАКЛЮЧЕНИЕ] Примерно через два года я читаю это, и я подумал, что смогу рассказать вам, чем я закончил. Я подумал, что @BluePeppers был прав, говоря, что я не должен быть так тесно связан с экосистемой Flask. Поэтому я выбрал регулярные задания cron, запускаемые каждую минуту, которые устанавливаются с помощью Ansible. Хотя это делает его немного более сложным (мне нужно было изучить Ansible и преобразовать некоторый код, чтобы его было достаточно каждую минуту), я думаю, что это более надежно. Я в настоящее время использую удивительныйpythonr-RQ для очередей a-sync заданий (проверка API и отправка электронных писем). Я только что узнал оRQ-планировщик, Я еще не проверял это, но он, кажется, делает именно то, что мне нужно в первую очередь. Так что, возможно, это совет для будущих читателей этого вопроса.
В остальном я просто желаю всем вам прекрасного дня!