【问题标题】:Flask app run with Gunicorn async workers appears less efficient than dev server使用 Gunicorn 异步工作器运行的 Flask 应用程序似乎比开发服务器效率低
【发布时间】:2017-04-24 16:13:36
【问题描述】:

我有一个用 Flask 开发的网络应用程序。设置很简单。该应用程序在 Gunicorn 上运行。所有请求都通过 nginx 代理。 Flask 应用程序本身向外部 API 发出 HTTP 请求。从 Flask 应用程序到外部 API 的 HTTP 请求由前端 javascript 代码的 AJAX 调用发起。外部 API 以 JSON 格式将数据返回到 Flask 应用程序并返回到前端。

问题是,当我在开发模式下使用选项multithreaded = True 运行此应用程序时,我可以看到 JSON 数据异步返回到服务器,并且我可以很快在前端页面上看到结果。

但是,当我尝试使用 nginx 和 gunicorn 在生产模式下运行应用程序时,我看到 JSON 数据按顺序返回 - 一个一个地慢慢退出。似乎由于某种原因,对外部 API 的 HTTP 请求被阻止了。

我在 linux Ubuntu Server 16.04 上使用主管。这就是我通过主管启动 gunicorn 的方式:

command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500

gunicorn 似乎没有异步处理请求,尽管它应该。

作为实验,我在开发模式下使用内置的 wsgi 服务器(不是 gunicorn)运行 Flask 应用程序,使用 debug=Truemultithreaded=True。所有请求仍然通过 nginx 代理。 JSON 数据返回得更快,即异步(似乎调用没有阻塞)。

我阅读了 gunicorn 的文档。它说如果我需要调用外部 API,那么我应该使用异步工作者。我使用它们,但它不起作用。

所有缓存的东西都被考虑在内。我可以假设我不使用任何缓存。我在检查服务器设置时将其全部清除。

我错过了什么?如何让 gunicorn 按预期运行?

谢谢。

【问题讨论】:

    标签: python asynchronous flask gunicorn supervisord


    【解决方案1】:

    我其实很快就解决了这个问题,忘了马上发布答案。 gunicorn 服务器没有像我预期的那样异步处理请求的原因非常简单和愚蠢。由于我将配置更改为:

    command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500 
    

    我忘了跑:

    sudo supervisorctl reread
    sudo supervisorctl update
    

    虽然很简单,但并不明显。我的错误是,在我使用以下命令在 gunicorn 上重新启动我的应用程序后,我希望配置自动更新:

    sudo supervisorctl restart my_app
    

    是的,它会重新启动应用程序,但不会重新启动 gunicorn 的配置。

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 2015-06-14
      • 2022-01-15
      • 2016-06-28
      • 2019-10-04
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多