Python 本地Flask服务器上的请求变慢
刚开始在本地服务器上使用Flask,我注意到请求/响应时间比我感觉的要慢得多 像下面这样一个简单的服务器需要将近5秒钟的响应时间Python 本地Flask服务器上的请求变慢,python,flask,Python,Flask,刚开始在本地服务器上使用Flask,我注意到请求/响应时间比我感觉的要慢得多 像下面这样一个简单的服务器需要将近5秒钟的响应时间 from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "index" if __name__ == "__main__": app.run() 有什么想法吗?或者本地服务器就是这样的吗?好的,我知道了。这似乎是Werkzeug和支持ip
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
有什么想法吗?或者本地服务器就是这样的吗?好的,我知道了。这似乎是Werkzeug和支持ipv6的操作系统的问题 从Werkzeug网站: 在支持ipv6并配置了ipv6的操作系统上,如现代Linux系统、OS X 10.4或更高版本以及Windows Vista,如果访问本地服务器,某些浏览器的速度可能会非常慢。原因是有时“localhost”被配置为在ipv4和ipv6套接字上都可用,一些浏览器将尝试先访问ipv6,然后访问ivp4 因此,修复方法是通过注释我的主机文件中的以下行,从本地主机禁用ipv6:
::1 localhost
一旦我这样做,延迟问题就会消失
我真的在挖烧瓶,我很高兴框架没有问题。我知道这不可能。我在除
localhost
之外的主机上运行时也遇到了此错误,因此对于某些主机,不同的底层问题可能会表现出相同的症状
我把我用过的大部分东西都换成了龙卷风,而且很有趣的是,它帮了我不少忙。我有过一些页面加载缓慢的情况,但总体来说,情况似乎更为迅速。同样,非常有趣,但我似乎注意到,烧瓶本身会随着时间的推移而减速,但烧瓶+龙卷风的速度就不那么慢了。我想使用Apache和mod_wsgi会让事情变得更好,但Tornado的设置非常简单(请参阅)
(还有一个相关的问题:)我这里有一个不同的解决方案。我刚刚从服务器的目录中删除了所有
.pyc
,然后重新启动它。
顺便说一下,localhost已经在我的主机文件(Windows8)中被注释掉了
服务器一直处于冻结状态,现在又可以正常工作了。将“threaded=True”作为参数添加到app.run(),如下所示:
例如:app.run(host=“0.0.0.0”,port=8080,threaded=True)
禁用ipv6的解决方案对我不起作用,但确实如此 来自@sajid siddiqi的解决方案在技术上是正确的,但请记住,Werkzeug中的内置WSGI服务器(打包到Flask中,用于
app.run()
)只是单线程的
安装WSGI服务器以处理多线程行为。我对各种WSGI服务器性能进行了大量研究。您的需求可能会有所不同,但如果您所使用的是Flask,那么我建议您使用以下Web服务器之一
更新(2020-07-25):看起来gevent在5年前就开始支持python3了,就在我评论说它不支持之后不久,所以现在可以使用gevent
gevent
您可以使用命令pip install gevent
通过pip安装gevent,或者使用命令pip3 install gevent
安装pip3。有关如何相应修改代码的说明如下:
meinheld
gevent更好,但从我所看到的所有涉及实际测试的基准来看,meinheld似乎是最直接、最简单的WSGI服务器。(如果您不介意进行更多配置,也可以查看uWSGI。)
您还可以使用命令pip3 install meinheld
通过pip3安装meinheld。从那里,查看meinheld源中提供的样本,以集成烧瓶:
*注意:在我使用PyCharm时,meinheld import server的行突出显示为错误,但服务器将运行,因此您可以忽略错误。我的问题通过“threaded=True”解决,但我想提供一些背景信息,以便将我的问题与其他可能无法解决的问题区分开来
我的问题只有在用python3运行烧瓶时才出现。切换到python2,我不再有这个问题
我的问题仅在使用Chrome访问api时才显现出来,此时Chrome显示了预期的屏幕,但其他所有内容(curl、ffx等)都挂起,直到我重新加载或关闭Chrome选项卡,此时等待的所有其他内容都返回了结果
我最好的猜测是Chrome试图保持会话打开,Flask阻止了后续请求。一旦Chrome的连接被停止或重置,其他一切都被处理
在我的情况下,线程修复了它。当然,我现在正在浏览其他人提供的一些链接,以确保它不会引起任何其他问题。threaded=True
对我来说很有效,但最后我发现问题是由firefox上的foxyproxy引起的。因为当flask应用程序在本地主机上运行时,如果
- firefox上已启用foxyproxy
如果
- firefox上已禁用foxyproxy
- 使用其他浏览器访问网站
我找到的唯一解决方案是禁用foxyproxy,尝试将localhost添加到代理黑名单并调整设置,但没有一个有效。我使用Miheko的响应来解决我的问题
::1 localhost
已在我的主机文件上被注释掉,设置Threaded=true
对我不起作用。每个REST请求都需要1秒来处理,而不是立即处理
我使用的是Python3.6,通过让flask使用gevent作为其WSGI,我使flask能够快速响应REST请求
要使用gevent,请使用pip安装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()