Flask 应用程序 运行 与 Gunicorn 异步工作者似乎比开发服务器效率低
Flask app run with Gunicorn async workers appears less efficient than dev server
我有一个用 Flask 开发的网络应用程序。设置很简单。该应用程序 运行ning 在 Gunicorn 上。所有请求都通过 nginx 代理。 Flask 应用程序本身向外部 API 发出 HTTP 请求。从 flask 应用程序到外部 API 的 HTTP 请求是由来自前端 javascript 代码的 AJAX 调用发起的。外部 API returns 格式的 JSON 数据到 Flask 应用程序并返回到前端。
问题是,当我 运行 这个应用程序在开发模式下使用 multithreaded = True
选项时,我可以看到 JSON 数据异步返回到服务器,我可以看到前端页面上的结果很快。
但是,当我尝试使用 nginx 和 gunicorn 在生产模式下 运行 应用程序时,我看到 JSON 数据按顺序返回 - 慢慢退出,一个接一个。似乎由于某种原因,对外部 API 的 HTTP 请求被阻止。
我在 linux Ubuntu 服务器 16.04 上使用主管。这就是我通过主管启动 gunicorn 的方式:
command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500
似乎 gunicorn 不异步处理请求,尽管它应该。
作为实验,我 运行 Flask 应用程序在开发模式下使用它内置的 wsgi 服务器(不是 gunicorn),debug=True
和 multithreaded=True
。所有请求仍然通过 nginx 代理。 JSON 数据返回得更快,即异步(似乎调用没有阻塞)。
我阅读了 gunicorn 的文档。它说如果我需要调用外部 API,那么我应该使用异步工作者。我用了但是没用。
所有缓存内容都已考虑在内。我可能会假设我不使用任何缓存。我检查服务器设置的时候都清除了。
我错过了什么?如何按预期制作 gunicorn 运行?
谢谢。
我实际上很快就解决了这个问题,忘记了 post 马上回答。 gunicorn 服务器没有像我期望的那样异步处理请求的原因非常简单和愚蠢。由于我在将配置更改为:
后通过主管管理 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 的配置。
我有一个用 Flask 开发的网络应用程序。设置很简单。该应用程序 运行ning 在 Gunicorn 上。所有请求都通过 nginx 代理。 Flask 应用程序本身向外部 API 发出 HTTP 请求。从 flask 应用程序到外部 API 的 HTTP 请求是由来自前端 javascript 代码的 AJAX 调用发起的。外部 API returns 格式的 JSON 数据到 Flask 应用程序并返回到前端。
问题是,当我 运行 这个应用程序在开发模式下使用 multithreaded = True
选项时,我可以看到 JSON 数据异步返回到服务器,我可以看到前端页面上的结果很快。
但是,当我尝试使用 nginx 和 gunicorn 在生产模式下 运行 应用程序时,我看到 JSON 数据按顺序返回 - 慢慢退出,一个接一个。似乎由于某种原因,对外部 API 的 HTTP 请求被阻止。
我在 linux Ubuntu 服务器 16.04 上使用主管。这就是我通过主管启动 gunicorn 的方式:
command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500
似乎 gunicorn 不异步处理请求,尽管它应该。
作为实验,我 运行 Flask 应用程序在开发模式下使用它内置的 wsgi 服务器(不是 gunicorn),debug=True
和 multithreaded=True
。所有请求仍然通过 nginx 代理。 JSON 数据返回得更快,即异步(似乎调用没有阻塞)。
我阅读了 gunicorn 的文档。它说如果我需要调用外部 API,那么我应该使用异步工作者。我用了但是没用。
所有缓存内容都已考虑在内。我可能会假设我不使用任何缓存。我检查服务器设置的时候都清除了。
我错过了什么?如何按预期制作 gunicorn 运行?
谢谢。
我实际上很快就解决了这个问题,忘记了 post 马上回答。 gunicorn 服务器没有像我期望的那样异步处理请求的原因非常简单和愚蠢。由于我在将配置更改为:
后通过主管管理 gunicorncommand = /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 的配置。