Python内联是否是线程安全的?

lem*_*ant 2 python multithreading thread-safety python-3.x

Python内联是否是线程安全的?我无法从谷歌那里找到明确的答案.

Omn*_*ous 8

是的,它们是不可变的,就像字符串一样.代码x += 1实际上创建了一个全新的整数对象并将其分配给x.

如果不清楚,那些不可变的东西是自动线程安全的,因为两个线程无法同时尝试修改同一个东西.你看,它们无法修改,因为它们是不可改变的.

解释器的示例:

>>> x = 2**123
>>> x
10633823966279326983230456482242756608
>>> id(x)
139652080199552
>>> a = id(x)
>>> x+=1
>>> id(x)
139652085519488
>>> id(x) == a
False
Run Code Online (Sandbox Code Playgroud)

  • 在同一个`x`上同时从两个线程执行`x + = 1`可能是不安全的整数操作,因为它不能保证是原子的(就像几乎所有其他语言一样).由于GIL,它在cPython上很可能是原子的,但这只是实现细节的副作用. (10认同)
  • @Rosh Oxymoron:这是事实.但是线程安全问题是"计算一个值并将其分配给共享变量线程安全吗?" 对于某些"No."值,特别是"No",答案为"No".如果计算的值涉及共享变量. (2认同)

V.E*_*E.O 5

Python 中的 Int 是不可变的,这意味着它以后无法修改,任何值更改都是将一个新的不可变 Int 对象分配给原始对象的过程。

但这并不意味着Python语法中的任何操作都是线程安全的,即使是GIL效果也是如此。例如:x+=1 根本不是线程安全的。

为了确保代码中的线程安全,您需要确定对一个对象的操作是否是线程安全的。对象本身不保证线程安全,GIL 也不保证。

参考: Python中的+=线程安全吗?


maa*_*det 4

正如其他人所说,Python 对象大多是线程安全的。尽管您需要使用锁来保护某个地方的对象,要求它在再次可用之前经历多次更改。