Python 线程:内存模型与可见性
Python的线程在内存可见性和语句重排序方面是否会像Java那样出现问题呢?我找不到什么关于“Python内存模型”的资料,尽管很多人都在写多线程的Python代码,所以我猜这些问题在这里可能不存在。例如,Python没有volatile这个关键词。不过,似乎没有明确说明,比如说一个线程中变量的变化是否会立即被其他线程看到。
也许这些对Python程序员来说都是显而易见的,但作为一个有点害怕的Java程序员,我需要一些额外的安心 :)
1 个回答
24
Python的线程处理没有一个正式的模型(其实,Java也曾经没有,直到很多年后才有希望会写出一个适合Python的模型)。
在实际使用中,没有哪个Python的实现会进行一些高级的优化,比如重新排列语句或者暂时把共享变量当作线程私有的来处理——虽然这些约束没有正式保证,但你可以相信它们是存在的。
特别是CPython,正如@Rawheiser提到的,它使用了一个全局解释器锁;而其他实现(比如PyPy、IronPython、Jython等)则没有这个锁(所以它们可以有效利用多个核心来处理线程,而CPython则需要通过多进程来实现同样的目的)。因此,如果你想写出可以在不同Python实现中通用的代码,就不要指望这一点。(所以,你也不能指望在CPython中因为有全局解释器锁而“原子性”的操作,比如访问字典——在其他Python实现中,多个线程可能会同时修改一个字典,这样就会出错,除非你用锁之类的东西来保护这个字典)。