Estoy empezando a jugar con Flask en un servidor local y me doy cuenta de que los tiempos de solicitud / respuesta son mucho más lentos de lo que creo que deberían ser.
Un simple servidor como el siguiente tarda cerca de 5 segundos en responder.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
¿Algunas ideas? ¿O es así como es el servidor local?
Respuestas:
Ok, lo descubrí. Parece ser un problema con Werkzeug y los sistemas operativos que admiten ipv6.
Desde el sitio de Werkzeug http://werkzeug.pocoo.org/docs/serving/ :
Entonces, la solución es deshabilitar ipv6 desde el localhost comentando la siguiente línea de mi archivo de hosts:
::1 localhost
Una vez que hago esto, los problemas de latencia desaparecen.
Realmente estoy investigando Flask y me alegro de que no sea un problema con el marco. Sabía que no podía ser.
fuente
Agregue "hilo = True" como argumento a app.run (), como se sugiere aquí: http://arusahni.net/blog/2013/10/flask-multithreading.html
Por ejemplo:
app.run(host="0.0.0.0", port=8080, threaded=True)
La solución de desactivación de ipv6 no funcionó para mí, pero esto sí.
fuente
--threaded
a mimanage.py
usoFlask-Script
también funcionó.flask run --with-threads
que resolvió mi problema.La solución de @ sajid-siddiqi es técnicamente correcta, pero tenga en cuenta que el servidor WSGI incorporado en Werkzeug (que está empaquetado en Flask y para lo que se usa
app.run()
) es solo de un solo subproceso.Instale un servidor WSGI para poder manejar el comportamiento de subprocesos múltiples. Investigué un montón sobre el rendimiento de varios servidores WSGI . Sus necesidades pueden variar, pero si todo lo que está usando es Flask , le recomendaría uno de los siguientes servidores web.
Actualización (2020-07-25): Parece que gevent comenzó a admitir python3 hace 5 años, poco después de que comenté que no era así, por lo que puede usar gevent ahora.
gevent
Puede instalar gevent a través de pip con el comando
pip install gevent
o pip3 con el comandopip3 install gevent
. Las instrucciones sobre cómo modificar su código en consecuencia están aquí: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#geventyo
gevent es mejor, pero de todos los puntos de referencia que he analizado que involucran pruebas en el mundo real, meinheld parece ser el servidor WSGI más sencillo y simplista . (También puede echar un vistazo a uWSGI si no le importa más configuración).
También puede instalar meinheld a través de pip3 con el comando
pip3 install meinheld
. A partir de ahí, mire la muestra proporcionada en la fuente de meinheld para integrar Flask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* NOTA: Por mi uso de PyCharm , la línea se
from meinheld import server
resalta como un error, pero el servidor se ejecutará, por lo que puede ignorar el error.fuente
En lugar de llamar a
http://localhost:port/endpoint
llamarhttp://127.0.0.1:port/endpoint
. Esto eliminó el retraso inicial de 500 ms para mí.fuente
Mi problema se resolvió con "threadded = True", pero quiero dar algunos antecedentes para distinguir mi problema de otros para los que esto puede no ser suficiente.
Mi mejor suposición es que Chrome estaba tratando de mantener la sesión abierta y Flask estaba bloqueando las solicitudes posteriores. Tan pronto como se detuvo o restableció la conexión de Chrome, se procesó todo lo demás.
En mi caso, el hilo lo solucionó. Por supuesto, ahora estoy revisando algunos de los enlaces que otros han proporcionado para asegurarme de que no causen ningún otro problema.
fuente
threaded=True
funciona para mí, pero finalmente descubrí que el problema se debe a foxyproxy en Firefox. Dado que cuando la aplicación del matraz se ejecuta en localhost, se produce una respuesta lenta sila respuesta lenta no sucederá si
foxyproxy está deshabilitado en firefox
acceder al sitio web utilizando otros navegadores
La única solución que encontré es deshabilitar foxyproxy, intenté agregar localhost a la lista negra de proxy y ajustar la configuración, pero ninguno de ellos funcionó.
fuente
Usé la respuesta de Miheko para resolver mi problema.
::1 localhost
ya estaba comentado en mi archivo de hosts y la configuraciónThreaded=true
no funcionó para mí. Cada solicitud de REST tardaba 1 segundo en procesarse en lugar de ser instantánea.Estoy usando Python 3.6, y conseguí que el matraz fuera rápido y respondiera a las solicitudes de REST al hacer que el matraz usara gevent como su WSGI.
Para usar gevent, instálelo con
pip install gevent
Posteriormente, usé https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 para configurar el matraz para usar gevent.
En caso de que el enlace no funcione, estas son las partes importantes del script:
from flask import Flask, Response from gevent.pywsgi import WSGIServer from gevent import monkey # need to patch sockets to make requests async # you may also need to call this before importing other packages that setup ssl monkey.patch_all() app = Flask(__name__) # define some REST endpoints... def main(): # use gevent WSGI server instead of the Flask # instead of 5000, you can define whatever port you want. http = WSGIServer(('', 5000), app.wsgi_app) # Serve your application http.serve_forever() if __name__ == '__main__': main()
fuente
Recibí este error cuando me ejecutaba en hosts distintos a los demás
localhost
, por lo que, para algunos, diferentes problemas subyacentes pueden presentar los mismos síntomas.Cambié la mayoría de las cosas que he estado usando a Tornado y, anecdóticamente, me ayudó mucho. He tenido algunas cargas de página lentas, pero las cosas parecen en general más receptivas. Además, es muy anecdótico, pero parece que me doy cuenta de que Flask solo se ralentizará con el tiempo, pero Flask + Tornado menos. Me imagino usar Apache y
mod_wsgi
haría las cosas aún mejor, pero Tornado es realmente simple de configurar (ver http://flask.pocoo.org/docs/deploying/others/ ).(Además, una pregunta relacionada: la aplicación Flask se cuelga ocasionalmente )
fuente
Tuve una solución diferente aquí. Acabo de eliminar todo
.pyc
del directorio del servidor y lo inicié de nuevo. Por cierto, localhost ya estaba comentado en mi archivo de hosts (Windows 8).El servidor estuvo congelado todo el tiempo y ahora funciona bien de nuevo.
fuente