gpt4 book ai didi

python - Python 中的 set.copy() 是原子的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:55 24 4
gpt4 key购买 nike

假设我们在一个类中有一个实例变量。

class MyClass(object):  
def __init__():
self.set1 = set()

下面的操作是原子的吗?

set_shallow_copy = self.set1.copy()

我尝试四处搜索,但我发现的唯一信息是读取实例变量是原子的。

(编辑)我试图反编译字节码(Windows 上的 Python 2.7),但它不是很有用。它只是显示调用 set 上的 copy 函数的 Python 字节码。

 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 时,没有其他线程可以更改它,因此您将获得 一些 状态的副本,该状态在(其他)线程进行操作期间该集合所处的状态。

版本中(比如这里标记的那个!),将原始集合的元素添加到新(最初为空)副本的例程没有利用以下事实:来自集合,所有值都是唯一的;因此,它使用 == 来重新发现该事实。如果这种比较是在 Python 中实现的(或通过释放 GIL 的某些 C 扩展),那么该过程可能会被其他线程中断(并任意失败)。

关于python - Python 中的 set.copy() 是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46333301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com