GIL全局解释器锁
1、什么是GIL全局解释器锁?
GIL并不是Python的特性,而是CPython解释器的概念。Python完全可以不依赖于GIL。
GIL本质是一把互斥锁,是加在CPython解释器身上的,同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码
2、为什么会有GIL?
为了利用多核,Python开始支持多线程,而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,于是有了GIL这把超级大锁。
简单的说GIL的存在更多的是历史原因。
3、GIL的影响
GIL的存在会对多线程的效率有不小影响,GIL会导致多线程无法很好的利用多核CPU的并发处理能力,甚至就几乎等于Python是个单线程的程序。
Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降
优点:保证Cpython解释器内存管理的线程安全
4、如何避免受到GIL的影响
1)、用multiprocessing替代Thread
multiprocessing库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,因此也不会出现进程之间的GIL争抢。
但multiprocessing的引入会增加程序实现时线程间数据通讯和同步的困难。
2)、用其他解释器
总结:
Python GIL其实是功能和性能之间权衡后的产物,它有其存在的合理性,也有较难改变的客观因素。
1)、因为GIL的存在,只有IO密集场景下的多线程会得到较好的性能;
2)、如果对并行计算性能较高的程序可以考虑把核心部分也成C模块,或者索性用其他语言实现