Wenn Sie den Entwicklungsserver ausführen - was Sie durch Ausführen erhalten app.run()
- erhalten Sie einen einzelnen synchronen Prozess, was bedeutet, dass höchstens 1 Anforderung gleichzeitig verarbeitet wird.
Wenn Sie Gunicorn in seiner Standardkonfiguration davor halten und einfach die Anzahl erhöhen --workers
, erhalten Sie im Wesentlichen eine Reihe von Prozessen (von Gunicorn verwaltet), die sich jeweils wie der app.run()
Entwicklungsserver verhalten . 4 Arbeiter == 4 gleichzeitige Anfragen. Dies liegt daran, dass Gunicorn standardmäßig den enthaltenen sync
Arbeitertyp verwendet.
Es ist wichtig anzumerken, dass Gunicorn auch asynchrone Arbeiter umfasst, nämlich eventlet
und gevent
(und auch tornado
, aber das scheint am besten mit dem Tornado-Framework verwendet zu werden). Wenn Sie einen dieser Async-Worker mit dem --worker-class
Flag angeben, erhalten Sie Gunicorn, das eine Reihe von Async-Prozessen verwaltet, von denen jeder seine eigene Parallelität verwaltet. Diese Prozesse verwenden keine Threads, sondern Coroutinen. Grundsätzlich kann in jedem Prozess immer noch nur 1 Ereignis gleichzeitig ausgeführt werden (1 Thread), aber Objekte können angehalten werden, wenn sie auf den Abschluss externer Prozesse warten (z. B. Datenbankabfragen oder Warten auf Netzwerk-E / A).
Wenn Sie also einen der asynchronen Mitarbeiter von Gunicorn verwenden, kann jeder Mitarbeiter mehr als eine einzelne Anfrage gleichzeitig bearbeiten. Wie viele Mitarbeiter am besten geeignet sind, hängt von der Art Ihrer App, ihrer Umgebung, der Hardware usw. ab. Weitere Informationen finden Sie auf der Design- Seite von Gunicorn und Hinweise zur Funktionsweise von gevent auf der Intro-Seite.
Derzeit gibt es eine weitaus einfachere Lösung als die bereits bereitgestellten. Wenn Sie Ihre Anwendung ausführen, müssen Sie nur den
threaded=True
Parameter an denapp.run()
Aufruf übergeben, wie:Eine weitere Option gemäß den Angaben in den werkzeug-Dokumenten ist die Verwendung des
processes
Parameters, der eine Zahl> 1 erhält, die die maximale Anzahl gleichzeitiger Prozesse angibt, die verarbeitet werden sollen:Etwas wie:
Weitere Informationen zur
run()
Methode hier und zum Blog-Beitrag , der mich dazu brachte, die Lösung und API-Referenzen zu finden.Hinweis: In den Flask-Dokumenten zu den
run()
Methoden wird darauf hingewiesen, dass von der Verwendung in einer Produktionsumgebung abgeraten wird, da ( Zitat ): "Der integrierte Server von Flask ist zwar leicht und benutzerfreundlich, eignet sich jedoch nicht für die Produktion, da er nicht gut skaliert werden kann . "Sie verweisen jedoch auf die Seite Bereitstellungsoptionen, um die empfohlenen Möglichkeiten für die Produktion zu finden.
quelle
Flask verarbeitet gleichzeitig eine Anfrage pro Thread. Wenn Sie 2 Prozesse mit jeweils 4 Threads haben, sind das 8 gleichzeitige Anforderungen.
Flask erzeugt oder verwaltet keine Threads oder Prozesse. Das ist die Verantwortung des WSGI-Gateways (z. B. Gunicorn).
quelle
Nein, mit mehr kann man definitiv umgehen.
Es ist wichtig, sich daran zu erinnern, dass die CPU tief im Inneren, wenn Sie einen Single-Core-Computer ausführen, wirklich immer nur einen Befehl * gleichzeitig ausführt.
Die CPU kann nämlich nur einen sehr begrenzten Satz von Befehlen ausführen, und sie kann nicht mehr als einen Befehl pro Takt-Tick ausführen (viele Befehle benötigen sogar mehr als einen Tick).
Daher ist die meiste Parallelität, über die wir in der Informatik sprechen, Software-Parallelität. Mit anderen Worten, es gibt Ebenen der Softwareimplementierung, die die CPU der untersten Ebene von uns abstrahieren und uns glauben lassen, dass wir gleichzeitig Code ausführen.
Diese "Dinge" können Prozesse sein, bei denen es sich um Codeeinheiten handelt, die gleichzeitig in dem Sinne ausgeführt werden, dass jeder Prozess glaubt, in seiner eigenen Welt mit seinem eigenen, nicht gemeinsam genutzten Speicher ausgeführt zu werden.
Ein weiteres Beispiel sind Threads, bei denen es sich um Codeeinheiten innerhalb von Prozessen handelt, die ebenfalls Parallelität ermöglichen.
Der Grund, warum Ihre 4 Worker-Prozesse mehr als 4 Anforderungen verarbeiten können, besteht darin, dass sie Threads auslösen, um mehr und mehr Anforderungen zu verarbeiten.
Das tatsächliche Anforderungslimit hängt vom ausgewählten HTTP-Server, E / A, Betriebssystem, Hardware, Netzwerkverbindung usw. ab.
Viel Glück!
* Anweisungen sind die grundlegenden Befehle, die die CPU ausführen kann. Beispiele - Fügen Sie zwei Zahlen hinzu und springen Sie von einer Anweisung zur nächsten
quelle