【问题标题】:Slow Requests on Local Flask Server本地 Flask 服务器上的缓慢请求
【发布时间】:2012-06-24 09:45:57
【问题描述】:

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

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

from flask import Flask

app = Flask(__name__)

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

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

有什么想法吗?还是本地服务器就是这样?

【问题讨论】:

  • 它不是本地服务器,但可能与后台运行的其他应用程序有关,您在哪个操作系统上运行它?
  • 我在 i7 iMac 上运行 OS X 10.7
  • 您的回复不应该花这么长时间,但实际上我之前已经搞砸了烧瓶,但没有成功,我建议Bottlepy。虽然仍然检查您的后台进程,但您可能有一个旧版本的服务器在后台运行,接管您的 python 并导致您的响应缓慢。也可能是您的浏览器在 chrome 和 safari 中发生这种情况?
  • @Meroon 的回答对我来说是正确的。但是,不要更改主机设置:我是否建议只使用 127.0.0.1 而不是 localhost?在不改变系统配置的情况下解决了问题。

标签: python flask


【解决方案1】:

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

来自 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,我很高兴这不是框架的问题。我知道不可能。

【讨论】:

  • 非常感谢!突然间,开发测试变得敏捷且响应迅速!我唯一的问题:由于 Mac 主机文件表明删除 localhost 可能会影响我的 Mac 的操作,我想知道它是否指的是这一行(或者只是将 localhost 定位到 127.0.0.1 的那一行
  • 在我的 windows 10 系统上,hosts 文件中的两个条目(ip4 和 ip6)都被注释掉了;它们由 DNS 系统解析。当我在“127.0.0.1”而不是“localhost”(简单调用从 2.0 到 0.003 秒)上运行服务器时,我得到了巨大的速度提升
  • 感谢您的回答!虽然我的情况有点不同(针对 aiosmtpd 运行 nose2),但您的回答给了我一个提示:当我在 Windows 10 笔记本电脑上禁用 IPv6 时,速度会提高 10 倍或 100 倍!!
【解决方案2】:

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

【讨论】:

  • 使用Flask-Script--threaded 传递给我的manage.py 也有效。
  • 对于那些通过启用线程来“修复”它的人,请注意!在这种情况下延迟是由于之前的请求没有正确关闭造成的,所以现在它实际上是just stacking a lot of threads
  • 感谢先生让我的 localhost 运行得非常快。
  • @snolflake:有没有办法知道请求是否没有正确关闭?
  • 从命令行我使用flask run --with-threads 解决了我的问题。
【解决方案3】:

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

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

更新 (2020-07-25):看起来 gevent 开始支持 python3 5 年前,不久后我评论说它没有,所以你可以现在使用 gevent

gevent

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

meinheld

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

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

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

【讨论】:

  • 我在使用 Flask 时遇到了严重的性能问题,即使是最简单的请求也需要大约 0.5 秒才能完成。刚刚切换到 gevent,一切正常,谢谢!
【解决方案4】:

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

【讨论】:

  • 对我来说,它删除了大约 3 秒(我从 0.0.0.0 移动到 127.0.0.1)。有人可以解释它为什么以及如何工作吗?
  • 天哪,为什么这行得通?从 2.06 秒到 0.002 秒。浏览器可以毫无问题地使用localhost,但是localhost上的requests.get需要2秒才能解决。
【解决方案5】:

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

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

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

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

【讨论】:

    【解决方案6】:

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

    • 在 firefox 上启用了 foxyproxy

    如果

    • 在 firefox 上禁用 foxyproxy

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

    我找到的唯一解决方案是禁用 foxyproxy,尝试将 localhost 添加到代理黑名单并调整设置,但都没有奏效。

    【讨论】:

      【解决方案7】:

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

      ::1 localhost 已在我的 hosts 文件中被注释掉,设置 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 将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()
      

      【讨论】:

      • threaded=True 不适用于(使用 python 3.6.7 和邮递员),我得到 VersionConflict: (greenlet 0.4.13 (c:\anaconda3\lib\site-packages),要求。 parse('greenlet>=0.4.14; platform_python_implementation == "CPython"')),请问如何解决这个问题,谢谢
      【解决方案8】:

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

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

      (还有一个相关问题:Flask app occasionally hanging

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-01-05
          • 1970-01-01
          • 2019-10-01
          • 2010-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          相关资源
          最近更新 更多