【问题标题】:start only one flask instance using apache + wsgi使用 apache + wsgi 只启动一个烧瓶实例
【发布时间】:2014-08-05 15:49:33
【问题描述】:

我正在使用 wsgi apacheflask 运行我的应用程序。我使用from yourapplication import app as application 来启动我的应用程序。到目前为止效果很好。问题是,每次请求都会创建一个我的应用程序的新实例。这导致我的烧瓶应用程序创建一个新的数据库连接但仅在大约 15 分钟后关闭它的不幸情况。由于我的服务器只允许 16 个打开的数据库连接,因此服务器很快就会开始阻止请求。顺便说一句:当我在没有 apache/wsgi 的情况下运行烧瓶时不会发生这种情况,因为它只打开一个连接并根据我的需要提供所有请求。

我想要什么:我只想运行 oneflask 实例,然后它会处理所有请求。

【问题讨论】:

    标签: python apache flask wsgi


    【解决方案1】:

    WSGIApplicationGroup 指令可能是您正在寻找的,只要您让 wsgi 应用程序以守护程序模式运行(否则我相信 apache 的默认行为是使用 prefork 来启动一个进程来处理每个单独的请求) :

    WSGIApplicationGroup 指令可用于指定一个 WSGI 应用程序或一组 WSGI 应用程序属于哪个应用程序组。同一应用程序组中的所有 WSGI 应用程序将在处理请求的进程的同一 Python 子解释器的上下文中执行。

    您必须为指定应用程序组名称的指令提供一个参数。有一些扩展变量:%{GLOBAL}%{SERVER}%{RESOURCE}%{ENV:variable};或者您可以指定自己的显式名称。 %{GLOBAL} 的特殊之处在于它扩展为空字符串,具有以下行为:

    应用程序组名称将设置为空字符串。 全局应用程序组中的任何 WSGI 应用程序将始终在 Python 初始化时创建的第一个解释器的上下文中执行。当 Python 的第三方 C 扩展模块使用简化的线程 API 来操作 Python GIL 并因此无法在 Python 创建的任何其他子解释器中正确运行时,可能需要强制 WSGI 应用程序在第一个解释器中运行。

    我建议指定 %{GLOBAL} 以外的其他内容。

    对于您拥有 mod_wsgi 生成的每个进程,所有内容都将在同一环境中执行。然后,您可以根据您希望 mod_wsgi 生成的进程数来简单地控制数据库连接数。

    【讨论】:

    • 我已经在使用WSGIApplicationGroup %{GLOBAL}。好像我不得不使用WSGIApplicationGroup %{RESOURCE}。现在它只会启动一个flask应用程序并将资源部分直接转发给flask。如果您可以将这两点添加到您的答案中,那么我可以接受。感谢您的帮助
    • 无论如何使用 WSGIApplicationGroup 可能是错误的,尤其是将其设置为 %{RESOURCE} ,因为这实际上是默认设置,因此不会有什么不同。您的问题将是由于多个进程,尤其是在运行嵌入式模式时。您应该改用守护程序模式。 code.google.com/p/modwsgi/wiki/ProcessesAndThreadingblog.dscpl.com.au/2012/10/…
    • 我有点假设它已经在守护进程模式下运行。我会将其添加到答案中。
    • 我运行它的时间更长了,同样的问题又出现了。然而,我们可以找到真正的问题。它与烧瓶无关。 (抱歉)我们使用 Azure VM 并将其连接到 Azure DB。看起来微软在连接它自己的工具/服务器时遇到了问题。不,我们在 VM 中运行我们自己的数据库。现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多