全局解释器锁简称:GIL(Global Interperter Lock)。首先需要明确一点就是,GIL并不是Python语言的特性,它是在现实Python解释器时引用的一个概念。GIL只在CPython解释器上存在。作用是保证同一时间内只有一个线程在执行。
线程互斥锁和GIL的区别
1.线程互斥锁是Python代码层面的锁,解决Python程序中多线程共享资源的问题(线程数据共共享,当各个线程访问数据资源时会出现竞争状态,造成数据混乱);
2.GIL是Python解释层面的锁,解决解释器中多个线程的竞争资源问题(多个子线程在系统资源竞争是,都在等待对象某个部分资源解除占用状态,结果谁也不愿意先解锁,然后互相等着,程序无法执行下去)。
GIL对程序有啥影响
1.Python中同一时刻有且只有一个线程会执行;
2.Python中的多个线程由于GIL锁的存在无法利用多核CPU;
3.Python中的多线程不适合计算机密集型的程序;
4.如果程序需要大量的计算,利用多核CPU资源,可以使用多进程来解决。
GIL 的存在使程序无法充分利用CPU进行运算,那么它真的一无是处么? 再进一步分析,程序分为两种,一种是上面提到的计算密集型程序,另一种叫作IO密集型程序。
大部分的程序在运行时,都需要大量IO操作,比如网络数据的收发,大文件的读写,这样的程序称为IO密集型程序。
IO密集型程序在运行时,需要大量的时间进行等待,那么这时如果IO操作不完成,程序就无法执行后面的操作,导致CPU空闲。
那么 GIL 对于这种IO密集型程序会有什么影响?
在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行,提高Python程序的执行效率。
如何改善GIL产生的问题
因为 GIL 锁是解释器层面的锁,无法去除 GIL 锁在执行程序时带来的问题。只能去改善。
1.更换更高版本的解释器,比如3.6,从3.2版本开始,据说Python对解释做了优化
2.更换解释器,比如JPython,但是由于比较小众,支持的模块较少,导致开发的效率降低
3.Python为了解决程序使用多核的问题,使用多进程代替多线程