在单独的线程中提供WSGI应用程序端点?

时间:2016-10-25 08:45:32

标签: python networking flask wsgi gunicorn

我有一个WSGI应用程序(它是一个Flask应用程序,但我觉得这应该是无关紧要的)在一个Gunicorn服务器端口9077下运行。该应用程序有一个/ status端点,它应该报告&# 39; OK'如果应用程序正在运行如果它无法在合理的时间内报告OK,整个容器将被杀死(由Kubernetes)。

问题在于:当应用程序负载很重(偶尔会发生)时,/ status端点可能需要一段时间才能响应,容器有时会过早被杀死。有没有办法配置Gunicorn始终在单独的线程中提供/ status端点?也许甚至在不同的港口?我很感激处理这种情况的任何提示或想法。

1 个答案:

答案 0 :(得分:1)

从未与Gunicorn合作,我不确定它是否支持此功能。

但是对于uWSGI,当我知道应用程序将处于沉重负载时, 我用uwsgi运行--processes(也可以在多线程模式下运行,或两者都运行)

uWSGI只是旋转了烧瓶应用程序的多个实例并充当负载均衡器,不需要不同的端口,uwsgi可以处理所有事情。
您不再受GIL约束,您的应用程序将使用计算机上的所有可用资源。

documentation about uWSGI concurrency

a quick tutorial on how to setup a flask app, uWSGI and nginx(你可以跳过nginx部分)

这是我提供的配置文件的一个示例。

[uwsgi]
module = WSGI:app
master = true
processes = 16
die-on-term = true
socket = 0.0.0.0:8808
protocol = http

uwsgi --daemonize --ini my_uwsgi_conf.ini

当它以这种方式运行时,我可以很容易地达到1000次/秒 希望有所帮助。

ps:另一种解决方案,只需启动运行应用程序的更多容器 并将它们置于nginx后面以进行负载平衡