【发布时间】:2012-01-17 18:06:44
【问题描述】:
我有一个使用 Apache prefork MPM 运行的简单 wsgi 应用程序,我一直在阅读 modwsgi docs on processes and threads(真的很好读)。我仍然对一些事情以及需要同步的内容感到困惑。
/1 如果我的 Apache 配置对于我的 wsgi 应用程序来说只是一个简单的 WSGIScriptAlias,如下所示:
WSGIScriptAlias /alias_name /path/to/wsgi/app.wsgi
假设 prefork MPM Apache 构建,那么 wsgi 线程和进程标志像这样 [wsgi.multiprocess = True, wsgi.multithread = False]。我理解这意味着单个进程(无线程)正在处理每个请求。根据这些条款,我不需要同步任何东西,因为我没有在进程之间进行任何 IPC,并且每个进程都有自己的地址空间。这是正确的想法吗?
/2 但是,如果我的 Apache 配置使用 WSGIDaemonPrcoesses:
WSGIScriptAlias /alias_name /path/to/wsgi/app.wsgi
WSGIDaemonProcess wsgi_proc_names processes=2 threads=2
WSGIProcessGroup wsgi_proc_names
然后 wsgi 标志以 [wsgi.multiprocess = true, wsgi.multithread = true] 出现,并且线程有可能会踩到彼此的脚趾。这是我可能需要同步对某些数据的访问的地方。如果我的应用程序没有 I/O,那么还有什么需要同步?例如,类变量是否需要在编辑时锁定?被多个线程调用的函数是否需要锁定和释放?这是我最困惑的地方。
谢谢 安杰洛
【问题讨论】: