Lorsque vous exécutez le serveur de développement - ce que vous obtenez en exécutant app.run()
, vous obtenez un seul processus synchrone, ce qui signifie qu'au plus 1 demande est traitée à la fois.
En plaçant Gunicorn devant lui dans sa configuration par défaut et en augmentant simplement le nombre de --workers
, vous obtenez essentiellement un certain nombre de processus (gérés par Gunicorn) qui se comportent chacun comme le app.run()
serveur de développement. 4 ouvriers == 4 requêtes simultanées. En effet, Gunicorn utilise son sync
type de travailleur inclus par défaut.
Il est important de noter que Gunicorn comprend également des travailleurs asynchrones, à savoir eventlet
et gevent
(et aussi tornado
, mais il est préférable de l'utiliser avec le framework Tornado, semble-t-il). En spécifiant l'un de ces travailleurs asynchrones avec l' --worker-class
indicateur, vous obtenez que Gunicorn gère un certain nombre de processus asynchrones, chacun gérant sa propre concurrence. Ces processus n'utilisent pas de threads, mais plutôt des coroutines. Fondamentalement, dans chaque processus, une seule chose peut se produire à la fois (1 thread), mais les objets peuvent être `` mis en pause '' lorsqu'ils attendent la fin des processus externes (pensez aux requêtes de base de données ou en attente d'E / S réseau).
Cela signifie que si vous utilisez l'un des nœuds de calcul asynchrones de Gunicorn, chaque collaborateur peut gérer bien plus qu'une seule requête à la fois. Le nombre de travailleurs qui convient le mieux dépend de la nature de votre application, de son environnement, du matériel sur lequel elle fonctionne, etc. Plus de détails peuvent être trouvés sur la page de conception de Gunicorn et des notes sur le fonctionnement de gevent sur sa page d'introduction.
Il existe actuellement une solution bien plus simple que celles déjà proposées. Lors de l'exécution de votre application, il vous suffit de transmettre le
threaded=True
paramètre à l'app.run()
appel, comme:Une autre option selon ce que nous pouvons voir dans la documentation werkzeug , est d'utiliser le
processes
paramètre, qui reçoit un nombre> 1 indiquant le nombre maximum de processus simultanés à gérer:Quelque chose comme:
Plus d'infos sur la
run()
méthode ici , et le billet de blog qui m'a amené à trouver la solution et les références API.Remarque: dans la documentation Flask sur les
run()
méthodes, il est indiqué que son utilisation dans un environnement de production est déconseillée car ( citation ): "Bien que léger et facile à utiliser, le serveur intégré de Flask ne convient pas à la production car il ne s'adapte pas bien . "Cependant, ils pointent vers leur page Options de déploiement pour les méthodes recommandées pour le faire lors de la mise en production.
la source
Flask traitera une demande par thread en même temps. Si vous avez 2 processus avec 4 threads chacun, cela fait 8 requêtes simultanées.
Flask ne génère ni ne gère les threads ou les processus. C'est la responsabilité de la passerelle WSGI (par exemple, gunicorn).
la source
Non, vous pouvez certainement gérer plus que cela.
Il est important de se rappeler qu'au fond, en supposant que vous exécutez une machine à un seul cœur, le processeur n'exécute en réalité qu'une seule instruction * à la fois.
À savoir, le CPU ne peut exécuter qu'un ensemble d'instructions très limité, et il ne peut pas exécuter plus d'une instruction par tick d'horloge (de nombreuses instructions prennent même plus d'un tick).
Par conséquent, la plupart des concurrents dont nous parlons en informatique est la concurrence logicielle. En d'autres termes, il existe des couches d'implémentation logicielle qui nous extraient le processeur de niveau inférieur et nous font penser que nous exécutons du code simultanément.
Ces «choses» peuvent être des processus, qui sont des unités de code exécutées simultanément dans le sens où chaque processus pense qu'il s'exécute dans son propre monde avec sa propre mémoire non partagée.
Un autre exemple est celui des threads, qui sont des unités de code à l'intérieur des processus qui permettent également la concurrence.
La raison pour laquelle vos 4 processus de travail seront capables de gérer plus de 4 requêtes est qu'ils déclencheront des threads pour gérer de plus en plus de requêtes.
La limite de demande réelle dépend du serveur HTTP choisi, des E / S, du système d'exploitation, du matériel, de la connexion réseau, etc.
Bonne chance!
* les instructions sont les commandes de base que le CPU peut exécuter. exemples - ajouter deux nombres, passer d'une instruction à une autre
la source