Je construis une application avec Flask, mais je ne connais pas grand chose à WSGI et à sa base HTTP, Werkzeug. Lorsque je commence à servir une application Flask avec gunicorn et 4 processus de travail), cela signifie-t-il que je peux gérer 4 demandes simultanées?
Je parle de demandes simultanées et non de demandes à la seconde ou quoi que ce soit d'autre.
Lorsque vous exécutez le serveur de développement, vous exécutez app.run()
, vous obtenez un seul processus synchrone, ce qui signifie au maximum 1 demandes en cours de traitement à 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 travailleurs == 4 demandes simultanées. Ceci est dû au fait que Gunicorn utilise son type de travailleur inclus sync
par défaut.
Il est important de noter que Gunicorn inclut également des travailleurs asynchrones, à savoir eventlet
et gevent
(et aussi tornado
, mais il vaut mieux utiliser le framework Tornado, semble-t-il). En spécifiant l'un de ces opérateurs asynchrones avec l'indicateur --worker-class
, Vous obtenez que Gunicorn gère un certain nombre de processus asynchrones , chacun d'eux gérer sa propre concurrence. Ces processus n'utilisent pas de threads, mais plutôt des coroutines. En gros, dans chaque processus, une seule chose peut encore se produire à la fois (1 thread), mais les objets peuvent être "suspendus" lorsqu'ils attendent que des processus externes soient terminés (pensez aux requêtes sur la base de données ou sur les E/S réseau).
Cela signifie que si vous utilisez l'un des travailleurs asynchrones de Gunicorn, chaque travailleur peut traiter plusieurs demandes à la fois. Le nombre maximum d'employés dépend de la nature de votre application, de son environnement, du matériel sur lequel il s'exécute, etc. Vous trouverez plus de détails à la page Conception de Gunicorn page et remarques sur la façon dont gevent fonctionne sur sa page d'introduction.
Flask traitera une demande par thread à la fois. Si vous avez 2 processus avec 4 threads chacun, c'est 8 demandes simultanées.
Flask ne génère ni ne gère de threads ou de processus. C’est la responsabilité de la passerelle WSGI (par exemple, gunicorn).
Il existe actuellement une solution beaucoup plus simple que celles déjà fournies. Lors de l'exécution de votre application, il vous suffit de transmettre le paramètre threaded=True
À l'appel app.run()
, comme suit:
app.run(Host="your.Host", port=4321, threaded=True)
Une autre option selon ce que nous pouvons voir dans werkzeug docs , consiste à utiliser le paramètre processes
, qui reçoit un nombre> 1 indiquant le nombre maximal de processus simultanés à gérer:
- threaded - le processus doit-il gérer chaque demande dans un thread séparé?
- processus - si supérieur à 1, gérez chaque demande dans un nouveau processus jusqu'à ce nombre maximal de processus simultanés.
Quelque chose comme:
app.run(Host="your.Host", port=4321, processes=3) #up to 3 processes
Plus d'informations sur la méthode run()
ici , et le article de blog qui m'a amené à trouver la solution et les références de l'API.
Non, vous pouvez certainement gérer plus que cela.
Il est important de se rappeler que, si l'on utilise une seule machine principale, le processeur n'exécute qu'une instruction * à la fois.
À savoir, le CPU ne peut exécuter qu'un ensemble très limité d'instructions et 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 plus grande partie de la concurrence dont nous parlons en informatique est la concurrence des logiciels. En d'autres termes, il existe des couches d'implémentation logicielle qui nous abstiennent du processeur de niveau inférieur et nous font penser que nous exécutons le code simultanément.
Ces "choses" peuvent être des processus, qui sont des unités de code qui s'exécutent simultanément, en ce sens que chaque processus pense s'exécuter 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 dans des processus autorisant également la concurrence.
La raison pour laquelle vos 4 processus de travail seront en mesure de traiter plus de 4 demandes est qu’ils lanceront des threads pour traiter de plus en plus de demandes.
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 processeur peut exécuter. exemples - ajouter deux nombres, passer d'une instruction à une autre