根据Python Documentation,Python上的append
操作是原子的。同时,加法操作不是原子的:
i = i + 1
我知道pythongil正在将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,在烟雾消散时将给出相同的最终结果相关问题 更多 >
编程相关推荐