Python GIL和全局变量

Bob*_*own 4 python gil

在python中,我定义了一个全局变量,它由不同的线程读取/递增.由于GIL,这会在不使用任何锁定机制的情况下导致问题吗?

Dan*_*l G 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
Run Code Online (Sandbox Code Playgroud)

如您所见,即使这些简单的操作也不仅仅是单个字节码指令.因此,无论何时在线程之间共享数据,都必须使用单独的锁定机制(例如,threading.lock)以保持数据一致性.

  • 哎哟.我的意思是,3个upvotes,没有人注意到`dis.dis("x = 753")`输出?我纠正了代码. (2认同)