如果面试时被问及python的GIL,那么你应当从以下2个方面回答
什么是GIL
对多线程的影响
1. 什么是GIL
GIL,即全局解释器锁 ,一个被广泛吐槽的技术,即便python3.9已经到来,这个GIL依然存在,而且似乎将继续存在。
为了解决多线程之间数据完整性和状态同步的问题,引入了GIL, 它可以保证多个原生线程不会并发执行 Python 字节码。
对于GIL的理解,有一点我们必须严肃的弄清楚,GIL并不是python的特性,而是实现Python解析器(CPython,我们平时默认下载安装使用的解释器)时所引入的一个概念,这个就好比C++是一套语言标准,但可以用 GCC,INTEL C++,Visual C++ 等编译器来编译,编译出来的可执行程序也就不一样。你可以使用 CPython,PyPy , JPython 来执行python的代码,CPython里有GIL,而JPython 就没有。
Python 的维护者们不是没考虑过将GIL移除,可是已经有太多的库依赖这个特性,积重难返。
2. 对多线程的影响
多线程原本是为了更好的利用CPU的多核资源,但是由于GIL的存在,使得同一个时刻,只能有一个python的线程在运行,显然,这是对资源的无耻浪费。
因此,你无法将python的多线程作为提升程序性能的一种手段,对于CPU密集型任务,请使用多进程。虽然如此,python的多线程也并非如大家所吐槽的那样鸡肋,对于I/O密集型任务,python多线程仍然有用武之地。
当一个线程I/O等待时,会释放GIL,这样其他线程就可以获得GIL来执行自己的任务,这就是你编写多线程爬虫加快爬取速度的技术依据。
3. 总结
最后做如下总结,面试的时候按照以下要点回答
GIL是全局解释器锁,以保证多个原生线程不会并发执行 Python 字节码,解决多线程之间数据完整性和状态同步的问题
GIL并不是python的特性,而是实现Python解析器时所引入的一个概念,我们默认下载使用的CPython有GIL,而JPython就没有
同一个时刻,只能有一个线程在运行,GIL导致不能有效利用CPU的多核
对于CPU密集型任务,使用多进程,对于I/O密集型任务,可以考虑使用多线程