在python中,我定义了一个全局变量,它由不同的线程读取/递增。由于GIL,这会在不使用任何锁定机制的情况下引起问题吗?
答案 0 :(得分: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)以保持数据的一致性。
答案 1 :(得分:3)
是的,没有锁定的多线程几乎总是会导致问题,无论是否有GIL。