刚开始在本地服务器上使用Flask,我注意到请求/响应时间比我认为的要慢。
只需一个简单的服务器,如下所示,需要近5秒才能响应。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
有什么想法吗?或者这只是本地服务器的方式?
答案 0 :(得分:81)
好的我明白了。 Werkzeug和os的支持ipv6似乎是一个问题。
来自Werkzeug网站http://werkzeug.pocoo.org/docs/serving/:
在支持ipv6并配置了现代Linux系统,OS X 10.4或更高版本以及Windows Vista的操作系统上,如果访问本地服务器,某些浏览器可能会非常慢。原因是有时“localhost”被配置为在ipv4和ipv6 socktes上都可用,并且一些浏览器将首先尝试访问ipv6然后尝试访问ivp4。
所以解决方法是通过从我的hosts文件中注释掉以下行来禁用localhost中的ipv6:
::1 localhost
一旦我这样做,延迟问题就会消失。
我正在挖掘Flask,我很高兴这不是框架的问题。我知道它不可能。
答案 1 :(得分:76)
将“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禁用解决方案对我不起作用,但确实如此。
答案 2 :(得分:7)
来自@ sajid-siddiqi的解决方案在技术上是正确的,但请记住 Werkzeug 中的内置 WSGI 服务器(打包成 Flask) 以及它用于app.run()
)的内容。
安装 WSGI 服务器以便能够处理多线程行为。我对各种 WSGI 服务器性能进行了大量研究。您的需求可能会有所不同,但如果您使用的是 Flask ,那么我会推荐以下网络服务器之一。
对于Python 2.x:gevent
您可以使用命令pip install gevent
通过 pip 安装 gevent 。有关如何相应修改代码的说明,请访问:http://flask.pocoo.org/docs/0.10/deploying/wsgi-standalone/#gevent
对于Python 3.x:meinheld
gevent 更好,但它仍然没有更新为使用 python3 (请参阅此主题获取更新:https://github.com/gevent/gevent/issues/38)。从我所看到的涉及实际测试的所有基准测试来看, meinheld 似乎是最直接,最简单的 WSGI 服务器。 (如果您不介意更多配置,也可以查看 uWSGI 。)
您还可以使用命令pip3 install meinheld
通过 pip3 安装 meinheld 。从那里,查看 meinheld 源中提供的示例,以集成 Flask :https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py
*注意:从我使用 PyCharm 开始,行from meinheld import server
突出显示为错误,但服务器将运行,因此您可以忽略该错误。
答案 3 :(得分:7)
而不是呼叫http://localhost:port/endpoint
,而是呼叫http://127.0.0.1:port/endpoint
。
这为我消除了最初的500ms延迟。
答案 4 :(得分:5)
我没有评论的声誉,所以我将其添加为“解决方案”。 我的问题是通过“threaded = True”来解决的,但是我想给出一些背景来区分我的问题和其他可能没有这个问题的问题。
我最好的猜测是,Chrome正试图让会话保持打开状态,Flask阻止后续请求。只要Chrome的连接停止或重置,其他所有内容都会被处理。
就我而言,线程修复了它。当然,我现在正在浏览其他人提供的一些链接,以确保它不会引起任何其他问题。
答案 5 :(得分:3)
threaded=True
对我有用,但最后我发现问题是由于firefox上的foxyproxy。由于烧瓶应用程序在localhost上运行时,如果
不会发生缓慢的反应
在firefox上禁用了foxyproxy
使用其他浏览器访问网站
我找到的唯一解决方案是禁用foxyproxy,尝试将localhost添加到代理黑名单和调整设置,但没有一个能够正常工作。
答案 6 :(得分:0)
我在localhost
以外的主机上运行时出现此错误,因此对于某些人来说,不同的潜在问题可能会出现相同的症状。
我把我用过的大部分东西都换成了龙卷风,并且传闻它有助于增加数量。我有一些缓慢的页面加载,但事情看起来通常更敏感。此外,非常轶事,但我似乎注意到Flask单独会随着时间的推移而减速,但Flask + Tornado不那么如此。我想使用Apache而mod_wsgi
会让事情变得更好,但是Tornado的设置非常简单(见http://flask.pocoo.org/docs/deploying/others/)。
(另外,相关问题:Flask app occasionally hanging)
答案 7 :(得分:0)
我在这里有一个不同的解决方案。我刚从服务器的目录中删除了所有.pyc
并再次启动它。
顺便说一下,localhost已在我的主机文件(Windows 8)中注释掉了。
服务器一直冻结,现在再次正常工作。
答案 8 :(得分:0)
我用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()