1.什么是Python的GIL?
GIL是Python的全局解释器锁,它是一个互斥锁。它确保在任何时间点只能有一个线程处于执行状态,即使在具有多个cpu内核的多线程体系结构中也是一样,这是造成python无法很好的利用计算机多核的原因
2.GIL处理了什么问题?
CPython的垃圾回收器使用一种称为引用计数的有效内存管理技术。Python中的每个对象都有一个引用计数,当它分配给新的变量名称或者添加到容器(元组、列表等)时,引用计数就会增加。同样,当引用超出范围或调用del语句时,引用计数也会减少。当对象的引用计数达到0时,将对其进行垃圾回收,并释放已分配的内存。
但是引用计数变量像任何其他全局变量一样容易出现竞争条件。另外如果向每个对象添加一个锁,这将导致死锁,并增加acquire和release调用的开销。
所以才有了全局解释器锁。另外仅在CPython中才有GIL,在其他如Jython、IronPython解释器中并没有GIL。
3.怎么降低GIL对Python性能的影响?
尽量避免在CPU密集型的场景下使用python线程,而是使用多进程,这样每个python进程都有自己的解释器和内存空间。如使用python标准库中的multiprocessing。
另一方面,python的多线程更适合在I/O密集型的场景下使用,因为一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程此时还是在一个一个等待的。