【问题标题】:Apache + mod_wsgi interactionApache + mod_wsgi 交互
【发布时间】:2011-12-19 14:38:12
【问题描述】:
在发布此之前,我已经阅读了很多在线资源,包括mod_wsgi wiki,但我对 Apache 进程/线程如何与 mod_wsgi 交互感到困惑。
这是我目前的理解:Apache 可以配置为运行一个或多个子进程可以处理传入的请求,并且这些子进程中的每一个都可以配置为依次使用一个或多个线程来服务请求。在那之后,对我来说事情开始变得模糊。我的疑问是:
- 什么是 WSGIDaemonProcess,谁使用 python 子解释器实际调用我的 Django 应用程序?
- 如果我的 Django 应用程序在一个 Apache 子进程中允许多个线程的模式下运行 - 这是否意味着多个请求可以同时访问我的应用程序?如果是这样 - 设置模块级变量(比如用户 ID 的变量)之类的操作是否会被其他并行请求覆盖并导致非线程安全行为?
- 对于上述情况,使用 Python 的全局解释器锁,线程实际上会并行执行吗?
【问题讨论】:
标签:
python
apache
mod-wsgi
【解决方案1】:
每个点的答案。
1 - WSGIDaemonProcess/WSGIProcessGroup 表明 mod_wsgi 应该分叉一个单独的进程来运行 WSGI 应用程序。这只是一个分叉,而不是一个分叉/执行,所以 mod_wsgi 仍然在控制它。当检测到 URL 映射到在守护模式下运行的 WSGI 应用程序时,Apache 子工作进程中的 mod_wsgi 代码会将请求详细信息代理到守护模式进程,在那里 mod_wsgi 代码读取它并调用您的 WSGI应用。
2 - 是的,多个请求可以同时运行并希望同时修改模块全局数据。
3 - 在 Python 内部执行的时候,不,它们不是严格并行运行的,因为全局解释器锁意味着一次只能有一个线程执行 Python 代码。 Python 解释器将定期切换要运行的线程。如果其中一个线程调用 C 代码并释放 GIL,那么至少在该线程处于该状态时,它可以与其他线程并行运行,以 Python 或 C 代码运行。例如,当调用 Apache/mod_wsgi 层以写回响应数据时,GIL 被释放。这意味着在底层实际回写响应数据并不会阻止其他线程运行。