Ich fange gerade an, mit Flask auf einem lokalen Server herumzuspielen, und stelle fest, dass die Anforderungs- / Antwortzeiten viel langsamer sind, als ich denke, dass sie sein sollten.
Nur ein einfacher Server wie der folgende benötigt fast 5 Sekunden, um zu antworten.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
Irgendwelche Ideen? Oder ist der lokale Server nur so?
Antworten:
Ok, ich habe es herausgefunden. Es scheint ein Problem mit Werkzeug und Betriebssystemen zu sein, die IPv6 unterstützen.
Von der Werkzeug-Website http://werkzeug.pocoo.org/docs/serving/ :
Das Update besteht also darin, ipv6 vom localhost zu deaktivieren, indem die folgende Zeile aus meiner Hosts-Datei auskommentiert wird:
Sobald ich dies tue, verschwinden die Latenzprobleme.
Ich grabe wirklich Flask und bin froh, dass es kein Problem mit dem Framework ist. Ich wusste, dass es nicht sein konnte.
quelle
Fügen Sie "threaded = True" als Argument zu app.run () hinzu, wie hier vorgeschlagen: http://arusahni.net/blog/2013/10/flask-multithreading.html
Beispielsweise:
app.run(host="0.0.0.0", port=8080, threaded=True)
Die IPv6-Deaktivierungslösung hat bei mir nicht funktioniert, aber das hat funktioniert.
quelle
--threaded
an meinemanage.py
Verwendung hat auchFlask-Script
funktioniert.flask run --with-threads
was mein Problem gelöst hat.Die Lösung von @ sajid-siddiqi ist technisch korrekt, aber denken Sie daran, dass der in Werkzeug integrierte WSGI- Server (der in Flask gepackt ist und wofür er verwendet wird)
app.run()
) nur Single-Threaded ist.Installieren Sie einen WSGI- Server, um Multithread-Verhalten verarbeiten zu können. Ich habe eine Reihe von Recherchen zu verschiedenen WSGI- Serverleistungen durchgeführt. Ihre Anforderungen können variieren, aber wenn Sie nur Flask verwenden , würde ich einen der folgenden Webserver empfehlen.
Update (2020-07-25): Es sieht so aus, als ob gevent vor 5 Jahren mit der Unterstützung von python3 begonnen hat, kurz nachdem ich kommentiert habe, dass dies nicht der Fall ist , sodass Sie gevent jetzt verwenden können.
gevent
Sie können gevent über pip mit dem Befehl
pip install gevent
oder pip3 mit dem Befehl installierenpip3 install gevent
. Anweisungen zum entsprechenden Ändern Ihres Codes finden Sie hier: https://flask.palletsprojects.com/de/1.1.x/deploying/wsgi-standalone/#geventmeinheld
gevent ist besser, aber von allen Benchmarks, die ich mir angesehen habe und die reale Tests beinhalten, scheint meinheld der einfachste und einfachste WSGI- Server zu sein. (Sie können sich auch uWSGI ansehen, wenn Ihnen die Konfiguration nichts ausmacht.)
Sie können meinheld auch über pip3 mit dem Befehl installieren
pip3 install meinheld
. Schauen Sie sich von dort aus das Beispiel in der meinheld- Quelle an, um Flask zu integrieren : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* HINWEIS: Bei meiner Verwendung von PyCharm wird die Zeile
from meinheld import server
als Fehler hervorgehoben, aber der Server wird ausgeführt, sodass Sie den Fehler ignorieren können.quelle
Mein Problem wurde durch "threaded = True" gelöst, aber ich möchte einige Hintergrundinformationen geben, um mein Problem von anderen zu unterscheiden, für die dies möglicherweise nicht der Fall ist.
Ich vermute, dass Chrome versucht hat, die Sitzung offen zu halten, und Flask die nachfolgenden Anforderungen blockiert hat. Sobald die Verbindung von Chrome gestoppt oder zurückgesetzt wurde, wurde alles andere verarbeitet.
In meinem Fall wurde das Threading behoben. Natürlich gehe ich jetzt einige der Links durch, die andere bereitgestellt haben, um sicherzustellen, dass keine anderen Probleme auftreten.
quelle
Anstatt
http://localhost:port/endpoint
anzurufenhttp://127.0.0.1:port/endpoint
. Dies beseitigte die anfängliche Verzögerung von 500 ms für mich.quelle
threaded=True
funktioniert für mich, aber schließlich habe ich herausgefunden, dass das Problem auf Foxyproxy auf Firefox zurückzuführen ist. Seitdem die Flask-App auf localhost ausgeführt wird, erfolgt eine langsame Reaktion, wennlangsame Reaktion wird nicht passieren, wenn
Foxyproxy ist auf Firefox deaktiviert
Greifen Sie mit anderen Browsern auf die Website zu
Die einzige Lösung, die ich gefunden habe, ist das Deaktivieren von Foxyproxy. Ich habe versucht, localhost zur Proxy-Blacklist hinzuzufügen und die Einstellungen zu optimieren, aber keine davon hat funktioniert.
quelle
Ich habe Mihekos Antwort verwendet, um mein Problem zu lösen.
::1 localhost
wurde bereits in meiner Hosts-Datei auskommentiert, und die EinstellungThreaded=true
hat bei mir nicht funktioniert. Die Verarbeitung jeder REST-Anforderung dauerte 1 Sekunde, anstatt sofort zu erfolgen.Ich verwende Python 3.6 und habe flask dazu gebracht, schnell zu sein und auf REST-Anfragen zu reagieren, indem flask gevent als WSGI verwendet.
Um gevent zu verwenden, installieren Sie es mit
pip install gevent
Danach habe ich https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 verwendet , um den Kolben für die Verwendung von gevent einzustellen.
Wenn der Link ausfällt, sind hier die wichtigen Teile des Skripts:
quelle
Ich habe diesen Fehler erhalten, wenn ich auf anderen Hosts
localhost
als auch ausgeführt habe, sodass bei einigen zugrunde liegenden Problemen dieselben Symptome auftreten können.Ich habe die meisten Dinge, die ich verwendet habe, auf Tornado umgestellt, und anekdotisch hat es eine Menge geholfen. Ich hatte ein paar langsame Seitenladevorgänge, aber die Dinge scheinen im Allgemeinen reaktionsschneller zu sein. Auch sehr anekdotisch, aber ich scheine zu bemerken, dass Flask alleine mit der Zeit langsamer wird, Flask + Tornado jedoch weniger. Ich stelle mir vor, Apache zu verwenden und
mod_wsgi
würde die Dinge noch besser machen, aber Tornado ist wirklich einfach einzurichten (siehe http://flask.pocoo.org/docs/deploying/others/). ).(Auch eine verwandte Frage: Kolben-App hängt gelegentlich )
quelle
Ich hatte hier eine andere Lösung. Ich habe gerade alles
.pyc
aus dem Serververzeichnis gelöscht und es erneut gestartet. Localhost wurde übrigens bereits in meiner Hosts-Datei (Windows 8) auskommentiert.Der Server hat die ganze Zeit eingefroren und jetzt funktioniert es wieder einwandfrei.
quelle