Python的整数类型是线程安全的吗?我在谷歌上没有找到一个明确的答案。
是的,它们像字符串一样是不可变的。代码x += 1
实际上创建一个全新的整数对象并将其赋值给x
。
如果不清楚的话,不可变的东西自动是线程安全的,因为两个线程无法同时尝试修改同一件事情。你看,它们不能被修改,因为它们是不可变的。
来自解释器的示例:
>>> x = 2**123
>>> x
10633823966279326983230456482242756608
>>> id(x)
139652080199552
>>> a = id(x)
>>> x+=1
>>> id(x)
139652085519488
>>> id(x) == a
False
x += 1
操作可能会导致整数不安全,因为它不能保证是原子的(就像几乎所有其他语言一样)。在cPython中它很可能是原子的,因为有全局解释器锁(GIL),但这只是实现细节的副作用。 - Rosh Oxymoron在Python中,Int是不可变的,这意味着它不能被修改,任何值的更改都是将一个新的不可变Int对象赋值给原始对象的过程。
但这并不意味着Python语法中的任何操作都是线程安全的,即使GIL也会受到影响。 例如:x+=1根本不是线程安全的。
为了确保代码的线程安全性,您需要找出对一个对象的操作是否是线程安全的。 对象本身并不保证线程安全,GIL也不保证。
就像其他人所说的一样,Python对象大多数情况下是线程安全的。但是如果需要在一个地方保护一个对象,在它再次可用之前需要进行多次更改,则需要使用锁。