一、什么是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全局锁,这样其他需要运行的线程就会使用该锁。
问题1: 什么时候会释放Gil锁
1. 遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil
2. 会有一个专门ticks进行计数 一旦ticks数值达到100这个时候释放Gil锁 线程之间开始竞争Gil锁(说明:ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)
问题2: 互斥锁和Gil锁的关系
- Gil锁 :保证同一时刻只有一个线程能使用到cpu
- 互斥锁 : 多线程时,保证修改共享数据时进行有序的修改,不会产生数据修改混乱。