【发布时间】: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=True 和 multithreaded=True。所有请求仍然通过 nginx 代理。 JSON 数据返回得更快,即异步(似乎调用没有阻塞)。
我阅读了 gunicorn 的文档。它说如果我需要调用外部 API,那么我应该使用异步工作者。我使用它们,但它不起作用。
所有缓存的东西都被考虑在内。我可以假设我不使用任何缓存。我在检查服务器设置时将其全部清除。
我错过了什么?如何让 gunicorn 按预期运行?
谢谢。
【问题讨论】:
标签: python asynchronous flask gunicorn supervisord