Python解构:GIL
https://zhuanlan.zhihu.com/p/75780308 (综述、GIL带来的问题)
https://realpython.com/python-gil/#what-problem-did-the-gil-solve-for-python (GIL诞生的历史背景和期望解决的问题)
GIL诞生的历史背景:python这门语言诞生时,尚未操作系统尚未出现多线程的概念,当时有很多C语言编写的python扩展,为了防止这些C扩展出现不一致的内存更改,出现了GIL,由GIL为这些扩展提供线程安全的内存管理
GIL期望解决的问题:python使用引用计数进行内存管理,在没有GIL保护的多线程程序中,对象的引用计数很容易出问题,导致更加严重的内存泄漏或者内存被错误的释放问题;可以给引用计数变量加锁保证对象的引用计数安全,但这样可能导致死锁问题,而且重复释放锁和加锁会导致性能下降。GIL规定:任何执行python字节码的线程都需要获取解释器锁,这样可以防止死锁(只有一个全局GIL锁)且不会因为频繁的加解锁引入太多的性能开销
PS:除了python,GIL也存在于Ruby等其他语言中,但GIL并不是解决垃圾收集的唯一解法(JVM通过可达性分析而不是引用计数解决GC问题),采用引用计数以外的方法进行内存管理可以避免GIL对线程安全得内存管理的需求,但这些不采用GIL的语言必须通过其他方式弥补没有GIL导致的单线程性能损失(JVM采用JIT编译提升程序性能)
GIL给python带来的问题:
1. 没有“真正的”多线程,只有并发,没有多线程并行(可以通过多进程实现多进程并行)
2. 在多核CPU上,由释放GIL锁带来的严重的“线程颠簸”问题,造成严重的CPU资源浪费
如何解决GIL带来的问题:
1. 使用多进程
2. 使用除了Cpython之外的python解释器
3. 等着吧,等着Cpython官方团队解决这个问题
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
北溟鱼的博客!
喜欢就支持一下吧