Apache + mod_wsgi 交互

14
在发布这篇文章之前,我已经阅读了很多网络资源,包括 mod_wsgi 维基,但我对 Apache 进程/线程与 mod_wsgi 如何交互仍感到困惑。
这是我的目前的理解:Apache 可以配置为运行一个或多个子进程来处理传入请求,每个子进程可以配置为再使用一个或多个线程来服务请求。在那之后,对我来说就开始变得模糊了。我的疑问有:
  1. 什么是 WSGIDaemonProcess,谁实际上调用我的 Django 应用程序使用 Python 子解释器?
  2. 如果我将我的 Django 应用程序运行在允许在单个 Apache 子进程中使用多个线程的模式下 - 是否意味着多个请求可能同时访问我的应用程序? 如果是这样的话 - 像设置模块级变量(例如用户ID)这样的事情会被其他并行请求覆盖并导致非线程安全行为吗?
  3. 对于上述情况,由于 Python 中的全局解释器锁,线程实际上是否会并行执行?
1个回答

12

每个要点的答案。

1 - WSGIDaemonProcess/WSGIProcessGroup 表明 mod_wsgi 应该 fork 出一个独立的进程来运行 WSGI 应用程序。这仅仅是一个 fork,而不是 fork/exec,所以 mod_wsgi 仍然控制着它。当检测到一个 URL 映射到在守护进程模式下运行的 WSGI 应用程序时,Apache 子工作进程中的 mod_wsgi 代码将通过代理请求详细信息到守护进程模式进程,那里的 mod_wsgi 代码读取它并调用到您的 WSGI 应用程序。

2 - 是的,多个请求可以同时操作并希望修改模块全局数据。

3 - 在 Python 内部执行的时间段内,严格来说它们并没有并行运行,因为全局解释器锁 (GIL) 意味着一次只能有一个线程执行 Python 代码。Python 解释器会定期切换正在运行的线程。如果其中一个线程调用 C 代码并释放 GIL,那么至少在线程处于该状态的时间内,它可以与其他运行 Python 或 C 代码的线程并行运行。例如,当调用 Apache/mod_wsgi 层写回响应数据时,GIL 被释放。这意味着实际在较低层写回响应数据不会阻止其他线程运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接