python 线程是否像 Java 那样暴露了内存可见性和语句重新排序的问题?由于我找不到对“Python 内存模型”或类似内容的任何引用,尽管事实上很多人都在编写多线程 Python 代码,我猜这些陷阱在这里不存在。例如,没有volatile关键字。但似乎并没有在任何地方明确说明,例如,一个线程中变量的更改对所有其他线程立即可见。
也许这些东西对 Python 程序员来说都是显而易见的,但作为一个可怕的 Java 程序员,我需要一点额外的保证:)
python 线程是否像 Java 那样暴露了内存可见性和语句重新排序的问题?由于我找不到对“Python 内存模型”或类似内容的任何引用,尽管事实上很多人都在编写多线程 Python 代码,我猜这些陷阱在这里不存在。例如,没有volatile关键字。但似乎并没有在任何地方明确说明,例如,一个线程中变量的更改对所有其他线程立即可见。
也许这些东西对 Python 程序员来说都是显而易见的,但作为一个可怕的 Java 程序员,我需要一点额外的保证:)
Python 的线程没有正式的模型(嘿,毕竟,多年来一直没有一个用于 Java 的模型……希望最终也会为 Python 编写一个模型)。
在实践中,没有 Python 实现执行任何高级优化,例如语句重新排序或临时将共享变量视为线程本地变量——即使没有正式保证,您也可以依靠这些语义约束。
特别是 CPython,正如@Rawheiser 所提到的,它使用全局解释器锁;其他实现(PyPy、IronPython、Jython 等)没有(因此它们可以通过线程模型有效地使用多个内核,而 CPython 需要多处理来实现相同的目的),所以如果你想要的话,你不应该指望它编写可在整个 Python 实现中移植的代码。(因此,您不应该指望由于 GIL 而在 CPython 中恰好是原子的操作的“原子性”,例如字典访问——在其他 Python 实现中,多个线程可能同时修改一个字典并导致除非你用锁等保护字典)。