2017-02-20 4 views
10

Nous exécutons un site Flask sous IIS sous Windows et, pour les tâches hors processus, nous utilisons Celery. Celery nous a causé quelques problèmes sous Windows, mais pour l'instant nous sommes satisfaits de l'exécution de la version 3.1.12, en utilisant RabbitMQ/AMQP comme back-end, qui fonctionne sous Windows.Quelle est la meilleure option pour une file d'attente de tâches (Python 3) sous Windows maintenant que Celery 4 a abandonné le support de Windows?

La nouvelle version de Celery (4) a dropped support for Windows, donc je suis à la recherche d'une alternative viable.

RQ semble une file d'attente de tâches très agréable, mais il ne supporte pas Windows (bottom of the page)

J'ai vu un peu plus, les files d'attente de tâches apparemment moins populaires comme:

Mais il n'est pas clair si ceux-ci supportent Windows et Flask. Je me demande si quelqu'un a l'expérience de l'exécution d'une file d'attente de tâches Python sous Windows qui fonctionne. Peut-être l'un de ceux que j'ai mentionnés, ou une alternative.

Ce n'est pas une option pour nous de faire tourner une machine Linux, parce que nous n'avons aucune expérience dans l'administration de Linux, et nous avons beaucoup de choses héritées qui nécessitent Windows.

+0

Avez-vous déjà trouvé un? Je suis à la recherche d'un pour les 2 dernières semaines et je ne peux pas en trouver un qui soit encore développé. –

+0

@KevinVasko; Huey est celui qui semble le plus répandu. J'ai expérimenté avec, et c'est simple et cela fonctionne. Cependant, j'ai trouvé un gros problème, et l'auteur ne pouvait pas m'aider non plus; Je ne peux pas utiliser les employés de Huey qui ont besoin d'un contexte Flask. Je ne peux pas comprendre comment passer les tâches dans ce contexte. Cela m'empêche actuellement d'utiliser Huey. –

+0

Merci pour les commentaires, je vais vérifier Huey, je ne suis pas obligé de travailler avec Flask donc j'espère que ce ne sera pas un problème.J'ai aussi trouvé un appelé "WorQ", mais il n'a pas été mis à jour depuis 3 ans et il n'est pas clair s'il supporte Windows ou pas. –

Répondre

6

Je lance Flask avec Huey sur Windows sans aucun problème, certes, seulement pour le développement et les tests. Pour la production, j'utilise Flask/Huey sur les serveurs Linux. Les deux avec le back-end de Redis, Flask 0.12 et Huey 1.2.0. J'utilise le modèle d'usine pour créer une version «coupée» spécialisée d'une application Flask pour une utilisation spécifique par les tâches Huey. Cette version ne charge pas les plans ou ne configure pas Flask-Admin car ils ne sont pas requis dans les tâches Huey.

Exemple de code de __init__.py dans le dossier de l'application. App est une classe allant de 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 

L'idée de configure_extensions est tirée de Quokka CMS. Examinez son app__init__.py et son extensions module pour voir comment cela est implémenté. Notez également comment ce projet crée également une application spécifique (create_celery_app) à utiliser avec la file d'attente de tâches Celery. Par exemple tasks.py Notez l'utilisation de with app.app_context(): pour créer le contexte Flask. Maintenant mes fonctions ont accès aux extensions telles que Flask-Mail, Flask-SqlAlchemy (db, modèles) 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) 
+0

Merci pour cette info; Je vais essayer de mettre cela en place et revenir à cette question par la suite. –

+0

J'implémente cela, mais je ne sais pas ce que vous faites dans l'import de configure_extensions. Envisageriez-vous de partager ce qui se passe là-bas? –

+0

@RicoSuave J'ai mis à jour ma réponse. – pjcunningham