Python 多线程和全局解释器锁
Python multithreading and Global Interpreter Lock
我最近遇到了Python中的GIL,根据它一次只能执行一个线程,多线程不能利用所有内核。
现在在我的一个项目中,我使用了多线程以及大量的锁和信号量
所以这里我的问题是,如果我不使用锁和信号量,我能达到同样的目的吗?即如果我从我的项目中删除并发逻辑。
编辑:我想知道的是,如果我删除并发逻辑是否有可能获得相同的功能,我知道什么是 GIL 并且它阻止线程使用所有内核并且只有一个线程是 运行一次。
全局解释器锁确保一次只有一个线程在执行字节代码。该执行可以随时中断。
考虑这个简单的函数,它可能旨在以原子方式将相关值存储到实例上的属性 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
(在 10
)和存储 b
(在 16
)之间被中断。该中断线程现在将 x
处于不一致状态。
我最近遇到了Python中的GIL,根据它一次只能执行一个线程,多线程不能利用所有内核。
现在在我的一个项目中,我使用了多线程以及大量的锁和信号量 所以这里我的问题是,如果我不使用锁和信号量,我能达到同样的目的吗?即如果我从我的项目中删除并发逻辑。
编辑:我想知道的是,如果我删除并发逻辑是否有可能获得相同的功能,我知道什么是 GIL 并且它阻止线程使用所有内核并且只有一个线程是 运行一次。
全局解释器锁确保一次只有一个线程在执行字节代码。该执行可以随时中断。
考虑这个简单的函数,它可能旨在以原子方式将相关值存储到实例上的属性 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
(在 10
)和存储 b
(在 16
)之间被中断。该中断线程现在将 x
处于不一致状态。