web-dev-qa-db-fra.com

Comment puis-je exécuter un travail en arrière-plan dans Flask sans thread ou file d'attente

Je construis l'API REST avec Flask-restplus. L'un de mes points de terminaison prend un fichier téléchargé à partir du client et exécute une analyse. Le travail utilise jusqu'à 30 secondes. Je ne veux pas que le travail bloque le processus principal. Ainsi, le système d'extrémité retournera une réponse avec 200 ou 201 immédiatement, le travail peut toujours être en cours d'exécution. Les résultats seront sauvegardés dans une base de données qui sera récupérée plus tard.

Il semble que j'ai deux options pour les travaux de longue durée. 

  1. Filetage
  2. File d'attente

Le filetage est relativement simple. Mais le problème est qu'il y a une limite de nombre de threads pour l'application Flask. Dans une application Python autonome, je pouvais utiliser une file d'attente pour les threads. Mais ceci est REST api, chaque appel de requête est indépendant. Je ne sais pas s'il existe un moyen de maintenir une file d'attente globale pour cela. Ainsi, si les demandes dépassent la limite de threads, il ne sera plus en mesure de prendre plus de demandes.

La file d'attente avec Celery et Redis est probablement la meilleure option. Mais ceci n’est qu’une preuve de concept, et la chronologie est un peu serrée. Configurer Celery, Redis avec Flask n’est pas facile, j’ai beaucoup de problèmes avec ma machine de développement qui est un Windows. Il sera déployé sur AWS, ce qui est plutôt complexe. 

Je me demande s'il existe une troisième option pour ce cas?

5
ddd

Je recommande vivement d'utiliser céleri comme vous l'avez déjà mentionné dans votre message. Il est construit exactement pour ce cas d'utilisation. Leur documentation est vraiment informative et les exemples en ligne ne manquent pas pour vous permettre de démarrer rapidement.

De plus, je dirais que THIS serait une excellente première ressource pour vous.

4
Harrison

Le céleri est une solution fantastique à ce problème que j’avais utilisé avec succès par le passé pour gérer millions d’emplois par jour.

Le seul inconvénient réel est la courbe d'apprentissage initiale et la complexité du débogage lorsque les choses tournent mal (cela peut arriver, notamment avec des millions d'emplois).

Si vous êtes ouvert à une solution hébergée, vous pouvez consulter Tâches distribuées intégrées au langage d'API Coherence

En pleine divulgation, c’est un produit que j’ai fabriqué en remplacement du céleri dans mes projets. C'est relativement plus simple que Celery à démarrer et vous n'avez pas besoin de gérer votre infrastructure de travail (ou de file d'attente).

1
brthornbury