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

2024-05-15 14:10:04 发布

您现在位置:Python中文网/ 问答频道 /正文

根据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操作原子化的字节码指令有什么区别


Tags: innonereturn字节valuedefloadmethod
1条回答
网友
1楼 · 发布于 2024-05-15 14:10:04

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

相关问题 更多 >