Apache + mod_wsgi交互

时间:2011-11-01 15:31:56

标签: python apache mod-wsgi

在发布之前,我已经在线阅读了很多资源,包括mod_wsgi wiki,但我对Apache进程/线程与mod_wsgi的交互方式感到困惑。

这是我目前的理解:可以将Apache配置为运行,使得一个或多个子进程可以处理传入请求,并且可以将这些子进程中的每一个配置为依次使用一个或多个线程来为请求提供服务。在那之后,事情开始变得模糊。我的怀疑是:

  1. 什么是WSGIDaemonProcess,谁使用python子解释器实际调用我的Django应用程序?
  2. 如果我的Django应用程序在一个Apache子进程中允许多个线程的模式下运行 - 这是否意味着多个请求可以同时访问我的应用程序?如果是这样 - 做一些像设置模块级变量(比如用户ID的变量)可能会被其他并行请求覆盖并导致非线程安全行为?
  3. 对于上面的情况,使用Python的全局解释器锁,线程实际上是否会并行执行?

1 个答案:

答案 0 :(得分:11)

每个要点的答案。

1 - WSGIDaemonProcess / WSGIProcessGroup指示mod_wsgi应该是一个用于运行WSGI应用程序的单独进程的fork。这只是一个fork而不是fork / exec,因此mod_wsgi仍然可以控制它。当检测到URL映射到以守护进程模式运行的WSGI应用程序时,Apache子工作进程中的mod_wsgi代码会将请求详细信息代理到守护进程模式进程,其中mod_wsgi代码读取它并调用到WSGI中应用

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

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