我最近遇到了Python中的GIL,根据它,一次只能执行一个线程,而多线程不能使用所有的内核。
现在,在我的一个项目中,我使用了多线程以及很多锁和信号量,所以这里我的问题是,如果我不使用锁和信号量,我能实现同样的目标吗?也就是说,如果我从我的项目中删除并发逻辑。
编辑:我想知道的是,如果删除并发逻辑,是否有可能实现相同的功能,我知道什么是GIL,它阻止线程使用所有的内核,并且一次只运行一个线程。
发布于 2017-09-14 05:50:06
全局解释器锁确保只有一个线程同时执行字节码。执行过程随时可能被打断。
考虑一下这个简单的函数,它可能用于原子地存储实例x上属性的相关值。
def f(x, a, b):
x.a, x.b = a, b下面是它分解为字节码的过程。
0 LOAD_FAST 1 (a)
3 LOAD_FAST 2 (b)
6 ROT_TWO
7 LOAD_FAST 0 (x)
10 STORE_ATTR 0 (a)
13 LOAD_FAST 0 (x)
16 STORE_ATTR 1 (b)
19 LOAD_CONST 0 (None)
22 RETURN_VALUE假设x不受mutex保护。然后,执行f(x, 1, 2)的任何线程都可以很容易地在存储a (at 10)和存储b (at 16)之间被中断。中断线程现在将看到x处于不一致的状态。
https://stackoverflow.com/questions/46210945
复制相似问题