我有一个在Flask中开发的网络应用程序。设置很简单。该应用程序正在Gunicorn上运行。所有请求都通过nginx代理。 Flask应用程序本身向外部API发出HTTP请求。从烧瓶应用程序到外部API的HTTP请求由来自前端的javascript代码的AJAX调用启动。外部API以JSON格式将数据返回到Flask应用程序,并返回到前端。
问题在于,当我使用选项multithreaded = True
在开发模式下运行此应用程序时,我可以看到JSON数据异步返回到服务器,我可以非常快速地在前端页面上看到结果。
但是,当我尝试使用nginx和gunicorn在生产模式下运行应用程序时,我看到JSON数据按顺序返回 - 逐个缓慢退出。似乎由于某种原因,对外部API的HTTP请求被阻止。
我在linux Ubuntu Server 16.04上使用supervisor。这就是我通过主管开始枪口的方式:
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,那么我应该使用异步工作者。我使用它们但它不起作用。
考虑了所有缓存内容。我可以假设我没有使用任何缓存。当我检查服务器设置时,我清除了所有内容。
我错过了什么?我如何按照预期运行炮弹?
感谢。
答案 0 :(得分:1)
我实际上很快就解决了这个问题而忘了立即发布答案。 gunicorn服务器没有像我期望的那样异步处理请求的原因非常简单和愚蠢。在我将配置更改为:
后,我通过主管管理gunicorn [[MPMusicPlayerController applicationMusicPlayer] setVolume:0]
我忘了跑:
command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500
虽然简单但不明显。我的错误是我希望配置在使用此命令在gunicorn上重新启动应用程序后自动更新:
sudo supervisorctl reread
sudo supervisorctl update
是的,它重启了应用程序,但没有重新启动。