gpt4 book ai didi

python - 为什么 Python 的 'append' 方法 'list' 是原子的,而 i = i + 1 不是原子的?

转载 作者:行者123 更新时间:2023-12-05 07:08:28 27 4
gpt4 key购买 nike

根据Python Documentation , Python list 上的 append 操作是原子的。同时加法操作不是原子的:

i = i + 1

我知道 Python GIL 强制 append 操作是原子的。我的问题是为什么 GIL 不对加法操作执行相同的操作?

考虑以下代码:

In [24]: L = []

In [25]: def func1():
...: L.append(2)
...:

In [26]: i = 0

In [27]: def func2():
...: i = i + 2
...:

两个函数的字节码如下所示:

In [28]: dis.dis(func1)
2 0 LOAD_GLOBAL 0 (L)
2 LOAD_METHOD 1 (append)
4 LOAD_CONST 1 (2)
6 CALL_METHOD 1
8 POP_TOP
10 LOAD_CONST 0 (None)
12 RETURN_VALUE

In [29]: dis.dis(func2)
2 0 LOAD_FAST 0 (i)
2 LOAD_CONST 1 (2)
4 BINARY_ADD
6 STORE_FAST 0 (i)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE

Python 确保线程切换仅发生在字节码指令之间。使 append 操作原子化的字节码指令有何不同?

最佳答案

因为 append 操作会对附加到的列表产生副作用,如果它不是原子的,它就没有任何语义的机会(并且很有可能转储核心)。相比之下,加法是一个简单得多的过程,而且是可交换的,因此在一个线程中执行 i+=1 而在另一个线程中执行 i-=1 将在烟雾散去时给出相同的最终结果。

关于python - 为什么 Python 的 'append' 方法 'list' 是原子的,而 i = i + 1 不是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61873909/

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