刚开始在本地服务器上试用Flask时,我注意到请求/响应时间比我预期的要慢得多。
像下面这样的简单服务器需要近5秒钟才能响应。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
有任何想法吗?还是这只是本地服务器的方式?
刚开始在本地服务器上试用Flask时,我注意到请求/响应时间比我预期的要慢得多。
像下面这样的简单服务器需要近5秒钟才能响应。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
有任何想法吗?还是这只是本地服务器的方式?
Answers:
好吧,我知道了。对于支持ipv6的Werkzeug和os来说,这似乎是一个问题。
从Werkzeug网站http://werkzeug.pocoo.org/docs/serving/:
在支持ipv6并进行了配置的操作系统(例如现代Linux系统,OS X 10.4或更高版本以及Windows Vista)上,如果访问本地服务器,某些浏览器的运行速度可能会非常慢。原因是有时ipv4和ipv6套接字都配置了“本地主机”,并且某些浏览器会尝试先访问ipv6,然后再访问ivp4。
因此,解决方法是通过从主机文件中注释掉以下行来从本地主机禁用ipv6:
::1 localhost
一旦执行此操作,延迟问题就会消失。
我真的在挖掘Flask,并且很高兴它不是框架的问题。我知道不可能。
如此处所示,将“ threaded = True”作为参数添加到app.run():http ://arusahni.net/blog/2013/10/flask-multithreading.html
例如: app.run(host="0.0.0.0", port=8080, threaded=True)
禁用ipv6的解决方案对我不起作用,但确实如此。
--threaded
给我的manage.py
使用也Flask-Script
起作用。
flask run --with-threads
它解决了我的问题。
@ sajid-siddiqi的解决方案在技术上是正确的,但请记住,Werkzeug中的内置WSGI服务器(打包到Flask中以及它的用途)仅是单线程的。app.run()
安装WSGI服务器以能够处理多线程行为。我对各种WSGI服务器性能进行了大量研究。您的需求可能会有所不同,但是如果您使用的只是Flask,那么我建议您使用以下Web服务器之一。
更新(2020-07-25):看起来gevent在5年前开始支持python3,在我评论它不支持之后不久,因此您现在就可以使用gevent。
Gevent
您可以安装GEVENT通过PIP用命令pip install gevent
或PIP3与命令pip3 install gevent
。有关如何相应修改代码的说明,请参见:https : //flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#gevent
持有人
gevent更好,但是从我查看过的涉及实际测试的所有基准测试来看,meinheld似乎是最直接,最简单的WSGI服务器。(如果您不介意进行更多配置,也可以看看uWSGI。)
您也可以使用命令通过pip3安装meinheld。从那里,查看meinheld源代码中提供的用于集成Flask的示例:https : //github.com/mopemope/meinheld/blob/master/example/flask_sample.pypip3 install meinheld
*注意:根据我对PyCharm的使用,该行from meinheld import server
突出显示为错误,但是服务器将运行,因此您可以忽略该错误。
我的问题已通过“ threaded = True”解决,但我想提供一些背景知识来将我的问题与其他可能无法解决的问题区分开。
我最好的猜测是Chrome试图保持会话打开,而Flask阻止了后续请求。与Chrome的连接一旦停止或重置,其他所有内容都会得到处理。
就我而言,线程修复了它。当然,我现在正在浏览其他人提供的一些链接,以确保它不会引起任何其他问题。
我用Miheko的回应来解决我的问题。
::1 localhost
已在我的主机文件上被注释掉,并且设置Threaded=true
对我不起作用。每个REST请求都需要1秒来处理,而不是立即执行。
我正在使用python 3.6,并且通过使flask使用gevent作为其WSGI,使flask变得快速且能够响应REST请求。
要使用gevent,请使用 pip install gevent
之后,我使用https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41来设置flask使用gevent。
如果链接断开,这是脚本的重要部分:
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()
在除主机之外的其他主机上运行时localhost
,也会出现此错误,因此对于某些不同的潜在问题,它们可能会表现出相同的症状。
我将我一直使用的大多数东西都切换到了龙卷风上,而且轶事对它有所帮助。我的页面加载速度很慢,但通常情况下响应速度更快。另外,很有趣,但我似乎注意到,单独的Flask会随着时间的流逝而变慢,但是Flask + Tornado的速度会变慢。我想使用Apachemod_wsgi
会使情况变得更好,但是Tornado的设置非常简单(请参见http://flask.pocoo.org/docs/deploying/others/)。
(还有一个相关的问题:Flask应用程序偶尔会挂起)