Python 本地Flask服务器上的请求变慢

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

刚开始在本地服务器上使用Flask,我注意到请求/响应时间比我感觉的要慢得多

像下面这样一个简单的服务器需要将近5秒钟的响应时间

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()