Как запустить повторяющуюся задачу в среде 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-планировщик, Я еще не проверял это, но он, кажется, делает именно то, что мне нужно в первую очередь. Так что, возможно, это совет для будущих читателей этого вопроса.

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

Ответы на вопрос(1)

Ваш ответ на вопрос