使用Apache + WSGI仅启动一个Flask实例
我正在使用 wsgi
、apache
和 flask
来运行我的应用程序。我用 from yourapplication import app as application
来启动我的应用,这样做到现在为止都没问题。不过,问题是每次请求都会创建一个新的应用实例。这就导致了一个不太好的情况:我的 flask 应用每次都会新建一个数据库连接,但大约在 15 分钟后才会关闭这个连接。因为我的服务器最多只允许 16 个打开的数据库连接,所以很快就会开始阻塞请求。顺便说一下,当我不通过 apache/wsgi 运行 flask 时,这种情况就不会发生,因为那时只会打开一个连接,能够处理我想要的所有请求。
我想要的效果是:只运行 一个
flask 实例,这样它就可以处理所有请求。
1 个回答
WSGIApplicationGroup
指令可能正是你需要的,只要你的 WSGI 应用在守护进程模式下运行(否则,我认为 Apache 的默认行为是使用 prefork,这种方式会为每个请求启动一个新的进程):
WSGIApplicationGroup 指令可以用来指定一个 WSGI 应用或一组 WSGI 应用属于哪个应用组。所有在同一应用组中的 WSGI 应用都会在处理请求的进程的同一个 Python 子解释器上下文中执行。
你需要给这个指令提供一个参数,用来指定应用组的名称。有几个可扩展的变量:%{GLOBAL}
、%{SERVER}
、%{RESOURCE}
和 %{ENV:variable}
;或者你可以指定一个自己的名称。%{GLOBAL}
是特别的,因为它会扩展为空字符串,这样会有以下行为:
应用组名称会被设置为空字符串。任何在全局应用组中的 WSGI 应用将始终在 Python 初始化时创建的第一个解释器的上下文中执行。强制 WSGI 应用在第一个解释器中运行是必要的,特别是当某个第三方的 C 扩展模块使用了简化的线程 API 来操作 Python 的全局解释器锁(GIL),因此在 Python 创建的任何额外子解释器中都无法正确运行。
我建议你指定一个不同于 %{GLOBAL}
的名称。
对于每个你让 mod_wsgi 启动的进程,所有的操作都会在同一个环境中执行。这样你就可以根据你希望 mod_wsgi 启动的进程数量来简单地控制数据库连接的数量。