Я создаю веб-сайт, который предоставляет посетителям некоторую информацию. Эта информация агрегируется в фоновом режиме путем опроса нескольких внешних 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, он жалуется, что flask-mail не может быть выполнен (
RuntimeError('working outside of application context')
). - Во-вторых, мне интересно, как это будет вести себя, когда я больше не использую встроенный отладочный сервер Flask, а производственный сервер, где можно сказать, 4 рабочих. Будет ли он запускать каждую работу четыре раза?
В целом я чувствую, что должен быть лучший способ запуска этих повторяющихся задач, но я не уверен, как это сделать. У кого-нибудь есть интересное решение этой проблемы? Все советы приветствуются!
[EDIT] Я только что читал о Celery с schedules. Хотя я действительно не вижу, как сельдерей отличается от APScheduler и может ли он таким образом решить мои две точки, мне интересно, читает ли кто-нибудь это, что я должен исследовать больше в Сельдерей?
[Заключение] Примерно через два года я читаю это, и я подумал, что могу дать вам понять, что у меня получилось. Я понял, что @BluePeppers прав, говоря, что я не должен так тесно привязываться к экосистеме Flask. Поэтому я выбрал регулярные задания cron, выполняемые каждую минуту, которые устанавливаются с использованием Ansible. Хотя это делает его немного сложнее (мне нужно было изучить Ansible и преобразовать какой-то код, чтобы его можно было запускать каждую минуту). Я думаю, что это более надежный. В настоящее время я использую awesome pythonr-rq для очередей заданий a-sync (проверка API-интерфейсов и отправка электронной почты). Я только что узнал о rq-scheduler. Я еще не тестировал его, но, похоже, именно то, что мне нужно, в первую очередь. Так что, возможно, это подсказка для будущих читателей этого вопроса.
В остальном я просто желаю вам прекрасного дня!