【问题标题】:mod_wsgi daemon mode, WSGIApplicationGroup and Python interpreter separationmod_wsgi 守护进程模式,WSGIApplicationGroup 和 Python 解释器分离
【发布时间】:2023-12-31 02:52:01
【问题描述】:

我的 Apache 有 2 个虚拟主机,每个都有一个使用 mod_wsgi 的 Django 站点,守护进程模式,如下所示:

<VirtualHost 123.123.123.123:80>
    WSGIDaemonProcess a.com user=x group=x processes=5 threads=1
    WSGIProcessGroup a.com
    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>

<VirtualHost 123.123.123.123:80>
    WSGIDaemonProcess b.com user=x group=x processes=5 threads=1
    WSGIProcessGroup b.com
    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>

因为a known problem with Xapian,我使用WSGIApplicationGroup %{GLOBAL}

现在,如果我了解幕后发生的事情,mod_wsgi 将为我的每个站点启动 5 个守护进程。我可以在 Apache 日志中看到这一点:

[info] mod_wsgi (pid=8106): Attach interpreter ''.
[info] mod_wsgi (pid=8106): Adding '.../lib/python2.5/site-packages' to path.
[info] mod_wsgi (pid=8106): Enable monitor thread in process 'a.com'.
[info] mod_wsgi (pid=8106): Enable deadlock thread in process 'a.com'.

[info] mod_wsgi (pid=8107): Attach interpreter ''.
[info] mod_wsgi (pid=8107): Adding '.../lib/python2.5/site-packages' to path.
[info] mod_wsgi (pid=8107): Enable monitor thread in process 'a.com'.
[info] mod_wsgi (pid=8107): Enable deadlock thread in process 'a.com'.

...

我不明白的是,那些 "Attach interpreter ''" 行是否表明所有这些进程共享相同的 Python 解释器,或者每个进程是否有一个解释器。 (顺便说一句,我意识到空的解释器名称 '' 是由将 %{GLOBAL} 传递给 WSGIApplicationGroup 引起的)。

我尝试检查是否可能在后续进程中累积了 sys.path 条目,但它们没有 - 这可能表明 5 个守护进程中的每一个都有一个单独的 Python 解释器......但我不太了解所有这些东西,所以我在这里问。

【问题讨论】:

    标签: python apache mod-wsgi


    【解决方案1】:

    “pid”值不同。它们处于不同的进程中。

    【讨论】:

    • 在这种情况下,WSGIApplicationGroup 是否会影响守护程序模式中的任何内容?
    • 在一个守护进程组的每个进程中,都有一个同名的解释器。 %{GLOBAL} 是主解释器,就像在命令行上运行一样,这意味着实际上您可以忽略子解释器的整个概念,而只是将其视为一个多进程应用程序,其中请求在所有进程中分发.
    • 我的脑袋太小了,所以让我要求澄清一下 - 对于守护进程组中的 5 个进程,有 5 个 %{GLOBAL} (即主)解释器,每个进程一个?如果我是对的,那么会产生什么效果:WSGIApplicationGroup MyOwnInterpreter - 每个进程会有两个解释器,%{GLOBAL} 和 MyOwnInterpreter,或者仍然只有一个,但名称不是 ''?
    • 会有两个,因为主解释器,即 %{GLOBAL},是作为在该进程中初始化 Python 本身的副作用而创建的。即,它始终存在。所以,如果使用守护模式并且只有一个应用程序,强制使用主解释器实际上也节省了一点内存,因为您没有在进程中创建额外的子解释器的开销。
    • 啊,现在我想我明白了 - WSGIApplicationGroup 允许多个 wsgi 应用程序使用同一个守护进程组,但仍然通过使用单独的 Python 彼此隔离(嗯,几乎隔离:*.com/questions/755070/…)守护进程中的子解释器。如果有人需要,它还允许将多个应用程序映射到一个共享解释器。对于 Xapian 和其他有类似问题的库的用户,它允许使用主要的 Python 解释器。太好了,感谢您的耐心等待!