我有一个简单的wsgi应用程序运行Apache prefork MPM,我一直在阅读modwsgi docs on processes and threads(真的很好读)。我仍然对一些事情以及需要同步的事情感到困惑。
/ 1 如果我的Apache配置只是一个简单的WSGIScriptAlias到我的wsgi应用程序,如下所示:
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,那还有什么需要同步?例如,是否需要在编辑时锁定类变量?是否需要锁定和释放多个线程调用的函数?这是我最困惑的。
由于 安吉洛
答案 0 :(得分:0)
安吉洛, 就#1而言,你的想法似乎很可靠。
你的第二个问题(#2)有点棘手。但据我所知,你需要锁定I / O(所以在你的情况下没有任何东西)。每个线程都应该拥有自己的调用堆栈,所以我认为你不需要锁定函数。唯一可能需要锁定的东西是全局变量。但你没有提到你会使用它们。