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