# 线程安全和GIL

# 线程安全

  • 需要注意,Python的内建对象都是线程安全的,但是其对象源码中并没有使用任何互斥锁,主要在于对其修改的操作都是由单个字节码完成的
  • GIL保证了Python虚拟机每次一定会完整的执行完一条字节码才有可能切换到下一个线程,而字节码如LOAD_CONST背后对应的是C语言的多条语句。如果没有GIL,那么在执行这条字节码的过程中发生切换,即没有完成的执行完背后的C语言语句,就会造成数据错误。
  • 即GIL保证了字节码层面的线程安全。

#STORE_SUBSCR

STORE_SUBSCR​ 是一个 Python 字节码指令,它的作用是将一个值存储到指定对象的子元素中,这个指令的操作数有三个,分别是存储对象、索引和值,它们分别表示要存储值的对象、子元素的索引和要存储的值。

具体来说,STORE_SUBSCR​ 的作用就是执行以下操作:

  1. 从操作数栈中弹出三个值,分别是存储对象、索引和要存储的值。
  2. 执行存储操作,将值存储到对象的指定子元素中。

STORE_SUBSCR​ 的操作与 Python 表达式 a[b] = c​ 的语义一致,即将值 c​ 存储到对象 a​ 的子元素 b​ 中。

注意,STORE_SUBSCR​ 操作需要保证存储对象是可变的,否则会引发 TypeError​ 异常。

a = dict()
a[1] = 1
a[2] = 2
  2           0 LOAD_NAME                0 (dict)
              2 CALL_FUNCTION            0
              4 STORE_NAME               1 (a)

  3           6 LOAD_CONST               0 (1)
              8 LOAD_NAME                1 (a)
             10 LOAD_CONST               0 (1)
             12 STORE_SUBSCR

  4          14 LOAD_CONST               1 (2)
             16 LOAD_NAME                1 (a)
             18 LOAD_CONST               1 (2)
             20 STORE_SUBSCR
             22 LOAD_CONST               2 (None)
             24 RETURN_VALUE