¿Cómo ejecutar una tarea recurrente en el marco de Python Flask?

Estoy construyendo un sitio web que proporciona información a los visitantes. Esta información se agrega en segundo plano al sondear un par de API externas cada 5 segundos. La forma en que lo tengo funcionando ahora es que usoAPScheduler trabajos. Inicialmente preferí APScheduler porque hace que todo el sistema sea más fácil de portar (ya que no necesito configurar trabajos cron en la nueva máquina). Comienzo las funciones de sondeo de la siguiente manera:

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)

Esto funciona un poco, pero hay algunos problemas con él:

Para empezar, esto significa que los trabajos de intervalo se ejecutan fuera del contexto de Flask. Hasta ahora, esto no ha sido un gran problema, pero cuando falla la llamada a un punto final, quiero que el sistema me envíe un correo electrónico (diciendo "hey, la API X falló"). Sin embargo, debido a que no se ejecuta dentro del contexto de Flask, se queja de quematraz no se puede ejecutar (RuntimeError('working outside of application context'))En segundo lugar, me pregunto cómo se comportará esto cuando ya no use el servidor de depuración incorporado de Flask, pero un servidor de producción con digamos 4 trabajadores. ¿Comenzará cada trabajo cuatro veces entonces?

En general, siento que debería haber una mejor manera de ejecutar estas tareas recurrentes, pero no estoy seguro de cómo. ¿Alguien por ahí tiene una solución interesante para este problema? ¡Todos los consejos son bienvenidos!

[EDITAR] Acabo de leer sobreApio con suhorarios. Aunque realmente no veo cómo Celery es diferente de APScheduler y si podría resolver mis dos puntos, me pregunto si alguien que lee esto piensa que debería investigar más en Celery.

[CONCLUSIÓN] Aproximadamente dos años después, estoy leyendo esto, y pensé que podría hacerle saber a ustedes con qué terminé. Pensé que @BluePeppers tenía razón al decir que no debería estar tan cerca del ecosistema Flask. Así que opté por trabajos cron regulares que se ejecutan cada minuto y que se configuran con Ansible. Aunque esto lo hace un poco más complejo (necesitaba aprender Ansible y convertir algo de código para que ejecutarlo cada minuto fuera suficiente) Creo que esto es más robusto. Actualmente estoy usando el increíblepythonr-rq para poner en cola trabajos de sincronización a (verificar API y enviar correos electrónicos). Me acabo de enterar deplanificador rq. Todavía no lo he probado, pero parece hacer precisamente lo que necesitaba en primer lugar. Quizás este sea un consejo para futuros lectores de esta pregunta.

Por lo demás, ¡les deseo a todos un hermoso día!

Respuestas a la pregunta(1)

Su respuesta a la pregunta