Apache + mod_wsgi交互

jef*_*eon 14 python apache mod-wsgi

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

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

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

Gra*_*ton 11

每个要点的答案.

1 - WSGIDaemonProcess/WSGIProcessGroup指示mod_wsgi应该是一个单独的进程的fork,用于运行WSGI应用程序.这只是一个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将被释放.这意味着在较低层的实际回写响应数据不会阻止其他线程运行.