一、什么是GIL锁

  GIL锁的英文全称:Global Interpreter Lock ,中文意思是:全局解释器锁。由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个解释器锁由于历史原因,现在几乎无法消除。

二、Python语言与GIL锁的关系

  Python语言和GIL解释器锁没有关系,它是在实现Python解析器(CPython)时所引入的一个概念,同样一段代码可以通过CPython,PyPy,Jpython等不同的Python执行环境来执行,然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷,实际上GIL并不是python的特性,仅仅是因为历史原因,在Cpython解释器中难以移除。

三、为什么GIL锁会影响多线程的性能

   因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。

四、如何调度

  既然python在同一时刻下只能运行一个线程的代码,那线程之间是如何调度的呢? 

  a、对于有io操作的线程,当一个线程在做i/o操作的时候,因为i/o操作不需要cpu,所以,这个时候,python会释放python全局锁,这样其他需要运行的线程就会使用该锁。 

  b、对于计算密集型的线程,比如一个线程可能一直需要使用cpu做计算,那么python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,这样其他的线程就可以执行代码了。 当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。

 

问题1: 什么时候会释放Gil锁

1. 遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil 

2. 会有一个专门ticks进行计数 一旦ticks数值达到100这个时候释放Gil锁 线程之间开始竞争Gil锁(说明:ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)

问题2: 互斥锁和Gil锁的关系

- Gil锁 :保证同一时刻只有一个线程能使用到cpu

- 互斥锁 : 多线程时,保证修改共享数据时进行有序的修改,不会产生数据修改混乱。