使用Gunicorn异步工作程序运行的Flask应用程序似乎效率低于dev服务器

时间:2017-04-24 16:13:36

标签: python asynchronous flask gunicorn supervisord

我有一个在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=Truemultithreaded=True。所有请求仍然通过nginx代理。 JSON数据返回得更快,即异步(似乎调用没有阻塞)。

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

考虑了所有缓存内容。我可以假设我没有使用任何缓存。当我检查服务器设置时,我清除了所有内容。

我错过了什么?我如何按照预期运行炮弹?

感谢。

1 个答案:

答案 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

是的,它重启了应用程序,但没有重新启动。