set.copy() 在 Python 中是原子的吗?
Is set.copy() atomic in Python?
假设我们在class中有一个实例变量。
class MyClass(object):
def __init__():
self.set1 = set()
下面的操作是原子操作吗?
set_shallow_copy = self.set1.copy()
我尝试四处搜索,但我发现的唯一信息是读取实例变量是原子的。
(编辑)
我试图反编译字节码(Python 2.7 on Windows),但它不是很有用。它只显示 Python 字节码调用 set
上的 copy
函数。
9 LOAD_FAST 0 (s)
12 LOAD_ATTR 1 (copy)
15 CALL_FUNCTION 0
18 STORE_FAST 1 (s2)
21 LOAD_CONST 0 (None)
24 RETURN_VALUE
(编辑 2):我想知道使用 set2 = set(set1) 是否会更好。
9 LOAD_GLOBAL 0 (set)
12 LOAD_FAST 0 (set1)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (set2)
21 LOAD_CONST 0 (None)
24 RETURN_VALUE
在 CPython 中,自版本 3.5 以来,副本在 Python 可见范围内是原子的(因为,像往常一样, 全局解释器锁 ).复制时没有其他线程可以更改 set1
,因此您将获得 some 状态的副本,该状态在(其他)线程进行操作期间该集合所处的状态。
在较旧的版本中(如此处标记的版本!),将原始集合的元素添加到新(最初为空)副本的例程没有利用事实上,来自 set
,所有值都是唯一的;因此,它使用 ==
来重新发现该事实。如果该比较是在 Python 中实现的(或通过释放 GIL 的某些 C 扩展),那么该过程可能会被其他线程中断(并任意失败)。
假设我们在class中有一个实例变量。
class MyClass(object):
def __init__():
self.set1 = set()
下面的操作是原子操作吗?
set_shallow_copy = self.set1.copy()
我尝试四处搜索,但我发现的唯一信息是读取实例变量是原子的。
(编辑)
我试图反编译字节码(Python 2.7 on Windows),但它不是很有用。它只显示 Python 字节码调用 set
上的 copy
函数。
9 LOAD_FAST 0 (s)
12 LOAD_ATTR 1 (copy)
15 CALL_FUNCTION 0
18 STORE_FAST 1 (s2)
21 LOAD_CONST 0 (None)
24 RETURN_VALUE
(编辑 2):我想知道使用 set2 = set(set1) 是否会更好。
9 LOAD_GLOBAL 0 (set)
12 LOAD_FAST 0 (set1)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (set2)
21 LOAD_CONST 0 (None)
24 RETURN_VALUE
在 CPython 中,自版本 3.5 以来,副本在 Python 可见范围内是原子的(因为,像往常一样, 全局解释器锁 ).复制时没有其他线程可以更改 set1
,因此您将获得 some 状态的副本,该状态在(其他)线程进行操作期间该集合所处的状态。
在较旧的版本中(如此处标记的版本!),将原始集合的元素添加到新(最初为空)副本的例程没有利用事实上,来自 set
,所有值都是唯一的;因此,它使用 ==
来重新发现该事实。如果该比较是在 Python 中实现的(或通过释放 GIL 的某些 C 扩展),那么该过程可能会被其他线程中断(并任意失败)。