3

在具有“一切都是对象”的所有这些想法的python中,线程安全在哪里?

我正在用 wsgi 开发 django 网站。它也可以在 linux 中工作,而且我知道他们使用有效的进程管理,所以我们不能考虑线程安全。我不怀疑模块是如何加载的,函数是否是静态的?每个信息都会有所帮助。

4

2 回答 2

8

模块中的函数等价于类中的静态方法。当多个线程可能正在修改共享数据,甚至一个线程可能正在修改这些数据而其他线程正在读取它时,就会出现线程安全问题;最好通过使数据由 ONE 模块拥有(通过 Queue.Queue 从其他模块访问)来避免,但是当这不可行时,您必须求助于锁定和其他更复杂的同步原语。

这适用于对共享数据的访问是否发生在模块函数、静态方法或实例方法中——共享数据是实例变量、类变量还是全局变量(范围和线程安全本质上是不相交的,除了那个函数-对于 pont 来说,本地数据本质上是线程安全的——没有其他线程会看到函数实例内的数据,除非函数故意通过共享容器“共享”它)。

如果您multiprocessing在 Python 的标准库中使用模块而不是threading模块,您实际上可能不必关心“线程安全”——本质上是因为进程之间没有共享数据......好吧,除非您不遗余力改变它,例如通过mmapped 文件;-)。

于 2009-07-12T06:40:47.753 回答
0

请参阅python 文档以更好地了解 Python 的一般线程安全含义。

从 1.0.3 开始, Django 本身似乎是线程安全的,但您的代码可能不是,您必须验证...

我的建议是根本不关心这一点,并使用多个进程而不是多个线程为您的应用程序提供服务(例如,使用 apache 'prefork' 而不是 'worker' MPM)。

于 2009-07-12T10:33:33.180 回答