2012-10-25 31 views
5

我们正在推出我们的下mod_wsgi的第一个Django应用程序django + mod_wsgi是否需要线程化编程?

`WSGIDaemonProcess our-appname processes=6 threads=15'` 

而且我们有一个关于讨论是否我们的Python代码,它使用的需求是线程安全与否Redis的和Postgres库。

从我可以从阅读的mod_wsgi文档告诉,即使apache的工人正在处理与多个阿帕奇线程的请求,我们蟒蛇代码对所有意图和目的单线程的。我在mod_wsgi文档中没有看到任何警告:“小心!!您现在必须担心全局数据和线程安全!”但也没有明确的“不要担心线程没有任何”。

我们没有在python代码中明确地使用线程做任何事情,在我们写的任何东西中都没有提及它们。

但是这里有些人认为我们现在使用的是我们现在处于多线程世界的threads=15

任何人都可以澄清这里究竟发生了什么?我们的Python代码现在是否可以通过相同的数据执行多个执行线程?

回答

6

是很明显,你正在运行多线程应用程序,如果你不小心用全局会产生问题,类如果你需要保持全球的东西,把它放在线程本地存储属性等

下面是从modwsgi doc, Building_A_Portable_Application

3的报价。应用程序必须是可重入的,或者简单地说,可以同时由多个线程同时调用。在请求的生命周期中需要存在的数据需要被存储为基于堆栈的数据,线程本地数据或者缓存在WSGI应用程序环境中的 。实际应用模块 内的全局变量不能用于此目的。

所以我认为你已经被充分警告。

0

Python解释不是线程安全的,尤其是因为引用计数,所以线程不能访问Python对象同时在相同的进程空间中。您无法配置mod_wsgi以无意或故意地解决此问题,因为解释器受GIL(全局解释器锁)的保护。因此,您不必担心会遇到同时线程访问相同内存对象(内存锁定等)的特别棘手的线程安全问题。

一些网络服务器(如带有gevent支持者的gunicorn)将同时在内存中有多个线程,以便不需要在I/O(数据库访问,网络访问等)上阻止单个进程。这也可能是mod_wsgi的情况。然而,这是在这样的,你不应该需要担心它在你的应用程序代码的方式实现的 - 如果你的应用是安全的多处理也应该是安全的这种有限的非并发线程的使用使用模型。

当然,您不能在运行时使用全局变量或动态编辑应用程序的某些部分,但是如果您在Django中做了类似的事情,那么甚至在您不必担心线程之前就会遇到问题。 Django和其他Web框架的设计使数据作为请求传入并作为响应输出,而不必担心该模型中的线程/进程安全性。

与任何Web应用程序一样,您需要担心对数据存储(尤其是数据库条目)的并发访问。当涉及到数据库访问时,防御性地进行编码。

+1

对不起,但我发现你的词语非常混乱。 Python解释器本身是线程安全的,如果不是,那么它会在整个地方崩溃。 Python解释器的内部状态和引用计数的管理由GIL调解,就像你说的那样,并且确保在多线程中使用Python解释器是安全的。解释它的方式很糟糕。 gevent的gunicorn也没有多个线程。当使用gevent时,它们在技术上不是线程,虽然它看起来像线程。 –

+1

现在线程安全的应用程序级代码的问题是一个不同的问题,但不要将它与Python解释器是否线程安全混淆。 –

+0

在第一次计数时,我想这是真的,虽然我不确定将python解释器描述为对于python对象的内存操作同时不是线程安全的,而不是解释它是线程安全的因为GIL阻止线程执行上述操作。关于第二点,我同意; gevent使用技术上不是线程的“绿色线程” - 我应该解释这一点。 –

1

我认为安德鲁的回答有点误导。 CPython(注意其他Python实现,如Jython和PyPy)具有GIL并不意味着您不必担心自己的代码是线程安全的!由于GIL,一个进程中的两个线程不能同时处于活动状态。但是并行性是通过定期在线程之间切换来模拟的。在执行程序期间,这种上下文切换可以在任何时候发生。例如,如果您拥有包含“全局”变量x的模块foo,则以下方法可能会输出2,3,4,...中的任何内容,具体取决于执行相同方法的线程数:

def bar(): 
    foo.x = 1 
    # a context switch might happen here! 
    foo.x = foo.x + 1 
    # or here! 
    print(foo.x) 

实际上,您可以将mod_wsgi配置为使用max。 1个线程。然后你不必担心线程安全。但是,程序的正确性取决于Web服务器的配置,这是非常不可取的情况。

相关问题