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