Ejecutamos un sitio Flask bajo IIS en Windows, y para tareas fuera de proceso usamos Celery. Celery nos ha dado algunos problemas bajo Windows, pero por ahora estamos satisfechos ejecutando la versión 3.1.12, usando RabbitMQ/AMQP como back-end, que funciona bajo Windows.
La nueva versión de Celery (4) ha dejado de ser compatible con Windows , por lo que estoy buscando una alternativa viable.
RQ parece una cola de tareas muy agradable, pero tampoco es compatible con Windows ( parte inferior de la página)
He visto algunas colas de tareas más aparentemente menos populares como:
Pero no está claro si son compatibles con Windows y Flask. Me pregunto si alguien tiene experiencia en ejecutar una cola de tareas de Python en Windows que funcione. Tal vez uno de los que mencioné, o una alternativa.
No es una opción para nosotros ejecutar una máquina Linux, porque no tenemos experiencia en la administración de Linux, y tenemos muchas cosas heredadas en ejecución que requieren Windows.
Ejecuto Flask con Huey en Windows sin ningún problema, es cierto que solo para desarrollo y prueba. Para la producción uso Flask/Huey en servidores Linux. Ambos con el back-end de Redis, Flask 0.12 y Huey 1.2.0.
Utilizo el patrón de fábrica para crear una versión "reducida" especializada de una aplicación Flask para uso específico en tareas de Huey. Esta versión no carga planos ni configura Flask-Admin, ya que no son necesarios en las tareas de Huey.
Código de ejemplo de __init__.py
en la carpeta de la aplicación. App
es una clase que se extiende desde Flask
:
def create_app(settings_override=None): app = App('app') if settings_override: app.config.from_object(settings_override) else: app.config.from_object(os.environ['APP_SETTINGS']) from .ext import configure_extensions configure_extensions(app, admin, load_modules=True) # REST import rest.api_v1 app.register_blueprint(api_v1_bp, url_prefix='/api/v1') # ... and more suff def create_huey_app(): app = App('huey app') app.config.from_object(os.environ['APP_SETTINGS']) from .ext import configure_extensions configure_extensions(app, admin=None, load_modules=False) return app
La idea de configure_extensions
está tomada de Quokka CMS . Examine su app
__init__.py
y su módulo de extensiones para ver cómo se implementa. Tenga en cuenta también cómo este proyecto también crea una aplicación específica ( create_celery_app
) para usar con la cola de tareas de Celery.
Ejemplo de tasks.py
. Tenga en cuenta el uso de with app.app_context():
para crear el contexto Flask. Ahora mis funciones tienen acceso a extensiones como Flask-Mail, Flask-SqlAlchemy (db, models), etc.
@huey.task() def generate_transaction_documents_and_email(transaction_id): app = create_huey_app() with app.app_context(): reports.generate_transaction_documents_and_email(transaction_id) @huey.task() def send_email(subject, recipients, text_body, html_body, attachments=[], cc=[]): app = create_huey_app() with app.app_context(): emails.send_email(subject, recipients, text_body, html_body, attachments, cc) @huey.periodic_task(crontab(minute='30')) def synchronize_mailing_list(): app = create_huey_app() if app.config['CREATESEND_SYNCHRONIZE']: _list_name = app.config['CREATESEND_LIST'] with app.app_context(): sync_delete_ar_subscribers(_list_name) sync_add_ar_subscribers(_list_name)