Python GIL与全局变量

4 投票
2 回答
733 浏览
提问于 2025-04-15 18:36

在Python中,我定义了一个全局变量,这个变量会被不同的线程读取和增加。由于有全局解释器锁(GIL),这样做会不会导致问题,如果不使用任何锁的机制呢?

2 个回答

3

是的,使用多线程而不加锁几乎总是会引发问题,无论是否有全局解释器锁(GIL)。

6

全局解释锁(GIL)只要求解释器在另一个线程可以接管之前,必须完全执行一条字节码指令。不过,我们不能假设一个加一的操作就是一条单独的指令。举个例子:

>>> import dis
>>> dis.dis(compile("x=753","","exec"))
  1           0 LOAD_CONST               0 (753)
              3 STORE_NAME               0 (x)
              6 LOAD_CONST               1 (None)
              9 RETURN_VALUE
>>> dis.dis(compile("x+=1","","exec"))
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (1)
              6 INPLACE_ADD
              7 STORE_NAME               0 (x)
             10 LOAD_CONST               1 (None)
             13 RETURN_VALUE

正如你所看到的,即使是这些简单的操作,也不止是一条字节码指令。因此,当你在多个线程之间共享数据时,一定要使用一个单独的锁机制(比如 threading.lock),以确保数据的一致性。

撰写回答