Python多线程和全局解释器锁

时间:2017-09-14 05:08:35

标签: python multithreading gil

我最近遇到了Python中存在的GIL,根据该GIL,一次只能执行一个线程,多线程无法利用所有内核。

现在在我的一个项目中,我使用了多线程和许多锁和信号量 所以我的问题是,如果我不使用锁和信号量,我可以实现同样的目的吗?即如果我从项目中删除并发逻辑。

编辑:我想知道的是,如果我删除并发逻辑是否可以获得相同的功能,我知道什么是GIL并且它阻止线程使用所有核心,并且一次只运行一个线程。 / p>

1 个答案:

答案 0 :(得分:4)

Global Interpreter Lock确保只有一个线程一次执行字节代码。执行可以随时中断。

考虑这个简单的函数,它可能用于将相关值原子地存储到实例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处于不一致状态。