在具有“一切都是对象”的所有这些想法的python中,线程安全在哪里?
我正在用 wsgi 开发 django 网站。它也可以在 linux 中工作,而且我知道他们使用有效的进程管理,所以我们不能考虑线程安全。我不怀疑模块是如何加载的,函数是否是静态的?每个信息都会有所帮助。
在具有“一切都是对象”的所有这些想法的python中,线程安全在哪里?
我正在用 wsgi 开发 django 网站。它也可以在 linux 中工作,而且我知道他们使用有效的进程管理,所以我们不能考虑线程安全。我不怀疑模块是如何加载的,函数是否是静态的?每个信息都会有所帮助。
模块中的函数等价于类中的静态方法。当多个线程可能正在修改共享数据,甚至一个线程可能正在修改这些数据而其他线程正在读取它时,就会出现线程安全问题;最好通过使数据由 ONE 模块拥有(通过 Queue.Queue 从其他模块访问)来避免,但是当这不可行时,您必须求助于锁定和其他更复杂的同步原语。
这适用于对共享数据的访问是否发生在模块函数、静态方法或实例方法中——共享数据是实例变量、类变量还是全局变量(范围和线程安全本质上是不相交的,除了那个函数-对于 pont 来说,本地数据本质上是线程安全的——没有其他线程会看到函数实例内的数据,除非函数故意通过共享容器“共享”它)。
如果您multiprocessing
在 Python 的标准库中使用模块而不是threading
模块,您实际上可能不必关心“线程安全”——本质上是因为进程之间没有共享数据......好吧,除非您不遗余力改变它,例如通过mmap
ped 文件;-)。