在Python中,我定义了一个全局变量,被不同的线程读取/增加。由于GIL的存在,如果没有使用任何锁机制,这会造成问题吗?
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),以维护数据一致性。
dis.dis("x=753")
的输出吗?我已经纠正了代码。 - tzot__getitem__
或__add__
或任何其他情况调用更多的Python代码。然后,您最终会在单个字节码中间出现线程交换。 - fijal是的,无锁多线程几乎总会导致问题,无论有没有GIL。