静态方法和线程安全
在Python中,有个概念是“万物皆对象”,那么线程安全在哪里呢?
我正在用WSGI开发一个Django网站。这个网站也可以在Linux上运行,听说Linux在进程管理方面做得很好,所以我们不需要太担心线程安全的问题。我对模块是如何加载的,以及它里面的函数是否是静态的没有疑问。任何信息都会对我有帮助。
2 个回答
8
模块中的函数就像类里的静态方法一样。线程安全的问题出现是因为多个线程可能会同时修改共享的数据,或者一个线程在修改数据时,其他线程正在读取这些数据。为了避免这种情况,最好让数据只属于一个模块(其他模块通过 Queue.Queue 来访问),但如果这样做不现实,就需要使用锁和其他更复杂的同步工具。
这个问题适用于无论是模块函数、静态方法还是实例方法访问共享数据。而共享的数据可以是实例变量、类变量或者全局变量(作用域和线程安全基本上是两个不同的概念,除了函数内部的数据在某种程度上是天生线程安全的——其他线程永远看不到函数内部的数据,除非这个函数故意通过共享容器“共享”它)。
如果你使用 Python 标准库中的 multiprocessing
模块,而不是 threading
模块,你实际上可能不需要担心“线程安全”——因为在进程之间没有共享数据……当然,除非你特意去改变这种情况,比如通过 mmap
文件。