什么是GIL?
GIL全称是Global Interpreter Lock,是python最常见的解释器CPython引入的一个概念。GIL是为了避免多个线程(threads)同时执行。因为CPython的内存管理并不是线程安全的,所以这个锁的存在是有必要的,短时间也是无法移除的。
GIL是一把全局排他所。毫无疑问,全局锁的存在会多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。
影响
GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势。
GIL只会影响到那些严重依赖CPU的程序(计算型),如果你
如何避免影响
用multiprocess替代Thread
即使用多进程而不是多线程。每个进程有自己的独立的GIL,因此不会出现进程之间的GIL争抢。
缺点:线程之间共享变量比较容易,对于thread来说,申明一个global变量,用thread.Lock的context包裹住三行就搞定了。而multiprocess由于进程之间无法看到对方的数据,只能通过在主线程申明一个Queue,put再get或者用share memory的方法。
使用其他解释器
JPython和IronPython没有GIL的问题,但是比较小众。功能和性能较差,不是个好选择。
核心部分使用其他语言
如果对并行计算性能较高的程序可以考虑把核心部分写成C模块,或者索性用其他语言实现
总结,GIL在较长一段时间内将会继续存在,但是会不断对其进行改进。