静态方法和线程安全

时间:2009-07-12 06:32:23

标签: python django thread-safety

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

我正在用wsgi开发django网站。它也适用于linux,因为我知道他们使用有效的流程管理,所以我们无法考虑线程安全。我不怀疑模块是如何加载的,而且函数是否是静态的?每一条信息都会有所帮助。

2 个答案:

答案 0 :(得分:8)

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

这适用于对共享数据的访问是在模块函数,静态方法还是实例方法中发生的 - 并且共享数据是这样的,无论是实例变量,类类还是全局变量(作用域和线程安全基本上是不相交的,除了函数本地数据本质上是线程安全的 - 没有其他线程会看到函数实例中的数据,除非函数故意通过共享容器“共享”它。

如果你在Python的标准库中使用multiprocessing模块,而不是threading模块,你实际上可能不必关心“线程安全” - 主要是因为没有数据共享过程......好吧,除非你不顾一切地改变它,例如通过mmap ped文件; - )。

答案 1 :(得分:0)

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

从1.0.3开始,Django本身似乎是thread safe,但是你的代码可能没有,你必须验证......

我的建议是简单地不关心它并使用多个进程而不是多个线程为您的应用程序提供服务(例如使用apache'prefork'而不是'worker'MPM)。