93

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

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

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "index"

if __name__ == "__main__":
    app.run()

有任何想法吗?或者这就是本地服务器的样子?

4

9 回答 9

99

好的,我想通了。这似乎是支持 ipv6 的 Werkzeug 和操作系统的问题。

从 Werkzeug 网站http://werkzeug.pocoo.org/docs/serving/

在支持 ipv6 并对其进行配置的操作系统上,例如现代 Linux 系统、OS X 10.4 或更高版本以及 Windows Vista,如果访问本地服务器,某些浏览器可能会非常缓慢。原因是有时“localhost”被配置为在 ipv4 和 ipv6 socktes 上都可用,一些浏览器会尝试先访问 ipv6,然后再访问 ivp4。

所以解决方法是通过从我的主机文件中注释掉以下行来从 localhost 禁用 ipv6:

::1             localhost 

一旦我这样做,延迟问题就会消失。

我真的在挖掘 Flask,我很高兴这不是框架的问题。我知道不可能。

于 2012-06-22T05:56:06.353 回答
96

将“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 的解决方案对我不起作用,但确实如此。

于 2015-02-28T00:30:14.347 回答
14

@sajid-siddiqi 的解决方案在技术上是正确的,但请记住Werkzeug中的内置WSGI服务器(打包到Flask中并用于它的用途)只是单线程的。app.run()

安装WSGI服务器以能够处理多线程行为。我对各种WSGI服务器性能进行了大量研究。您的需求可能会有所不同,但如果您使用的只是Flask,那么我会推荐以下网络服务器之一。

更新(2020-07-25):gevent似乎在5 年前开始支持python3 ,在我评论它不支持之后不久,所以你现在可以使用gevent

事件

您可以通过pip使用 command或pip3使用 command安装gevent。有关如何相应修改代码的说明如下:https ://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#geventpip install geventpip3 install gevent

梅海尔德

gevent更好,但从我看过的所有涉及真实世界测试的基准测试来看,meinheld似乎是最直接、最简单的WSGI服务器。(如果您不介意更多配置,也可以查看uWSGI 。)

您也可以使用命令通过pip3安装meinheld。从那里,查看meinheld源中提供的示例以集成Flaskhttps ://github.com/mopemope/meinheld/blob/master/example/flask_sample.pypip3 install meinheld

*注意:根据我对PyCharm的使用,该行from meinheld import server突出显示为错误,但服务器将运行,因此您可以忽略该错误。

于 2015-04-27T04:39:22.017 回答
13

而不是调用http://localhost:port/endpointcall http://127.0.0.1:port/endpoint。这为我消除了最初的 500 毫秒延迟。

于 2020-02-01T14:09:08.960 回答
8

我的问题已通过“线程 = True”解决,但我想提供一些背景信息以将我的问题与其他可能无法解决的问题区分开来。

  1. 我的问题仅在使用 python3 运行 Flask 时出现。切换到python2,我不再遇到这个问题。
  2. 我的问题仅在使用 Chrome 访问 api时才出现,此时 Chrome 显示了预期的屏幕,但其他所有内容都挂起(curl、ffx 等),直到我重新加载或关闭 Chrome 选项卡,此时其他所有内容都在等待周围返回了一个结果。

我最好的猜测是 Chrome 试图保持会话打开,而 Flask 阻止了后续请求。一旦来自 Chrome 的连接停止或重置,其他所有内容都会被处理。

就我而言,线程修复了它。当然,我现在正在浏览其他人提供的一些链接,以确保它不会导致任何其他问题。

于 2016-07-01T18:01:52.463 回答
5

threaded=True对我有用,但最后我发现问题是由于 Firefox 上的 foxyproxy 造成的。因为当烧瓶应用程序在本地主机上运行时,如果

  • 在 firefox 上启用了 foxyproxy

反应慢不会发生,如果

  • foxyproxy 在 firefox 上被禁用

  • 使用其他浏览器访问网站

我找到的唯一解决方案是禁用 foxyproxy,尝试将 localhost 添加到代理黑名单并调整设置,但它们都不起作用。

于 2017-06-18T18:46:08.060 回答
3

我使用 Miheko 的回复来解决我的问题。

::1 localhost已经在我的主机文件中注释掉了,并且设置Threaded=true对我不起作用。每个 REST 请求都需要 1 秒的时间来处理,而不是即时处理。

我正在使用 python 3.6,并且通过使烧瓶使用 gevent 作为其 WSGI,我使烧瓶能够快速响应 REST 请求。

要使用 gevent,请安装它pip install gevent

之后,我使用https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41将烧瓶设置为使用 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()
于 2019-03-10T08:44:51.240 回答
0

我在其他主机上运行时也遇到了这个错误localhost,所以对于某些不同的潜在问题可能会表现出相同的症状。

我把我一直在使用的大部分东西都换成了 Tornado,有趣的是它帮助了很多。我有一些缓慢的页面加载,但事情似乎通常更具响应性。此外,非常轶事,但我似乎注意到单独的 Flask 会随着时间的推移而减慢,但 Flask + Tornado 则不那么慢。我想象使用 Apachemod_wsgi会让事情变得更好,但 Tornado 的设置非常简单(参见http://flask.pocoo.org/docs/deploying/others/)。

(另外,一个相关的问题:Flask 应用程序偶尔挂起

于 2012-12-28T01:54:03.313 回答
0

我在这里有一个不同的解决方案。我刚刚.pyc从服务器的目录中删除了所有内容并重新启动它。顺便说一句, localhost 已经在我的主机文件(Windows 8)中被注释掉了。

服务器一直在冻结,现在它又可以正常工作了。

于 2014-05-07T05:18:48.173 回答