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 扩展),那么该过程可能会被其他线程中断(并任意失败)。