1.GIL是什么?
GIL全称Global Interpreter Lock,即全局解释器锁。 作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行。
GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。python 与 python解释器是两个概念,切不可混为一谈,也就是说,GIL只存在于使用C语言编写的解释器CPython中。
通俗地说,就是如果你不用Python官方推荐的CPython解释器,而使用其他语言编写的Python解释器(比如  JPython: 运行在Java上的解释器,直接把python代码编译成Java字节码执行 ),就不会有GIL问题。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
 
2.GIL有什么作用?
为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性。  python为了利用多核,开始支持多线程,但线程是非独立的,所以同一进程里线程是数据共享,当各个线程访问数据资源时会出现竞状态,即数据可能会同时被多个线程占用,造成数据混乱,这就是线程的不安全。而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。GIL能限制多线程同时执行,保证同一时间内只有一个线程在执行。
 
3.GIL有什么影响?
GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。
 
4.如何避免GIL带来的影响?
方法一:用进程+协程 代替 多线程的方式
在多进程中,由于每个进程都是独立的存在,所以每个进程内的线程都拥有独立的GIL锁,互不影响。但是,由于进程之间是独立的存在,所以进程间通信就需要通过队列的方式来实现。
 
方法二:更换解释器
像JPython和IronPython这样的解析器由于实现语言的特性,他们不需要GIL的帮助。然而由于用了Java/C#用于解析器实现,他们也失去了利用社区众多C语言模块有用特性的机会。所以这些解析器也因此一直都比较小众。

最新文章

  1. Unity.Interception(AOP)
  2. Fast RCNN 训练自己的数据集(3训练和检测)
  3. 高并发下MySQL出现checking permissions
  4. 【WebGoat习题解析】AJAX Security->Insecure Client Storage
  5. java基础小知识
  6. FM/PCM与FM/PPM的区别
  7. hiphop-php 搭建 (CentOS)
  8. ulink 固件更新问题
  9. Redis常见问题及处理方法
  10. JVM -- 类加载
  11. 【Cocos2d-x 粒子系统】火球用手指飞起来
  12. 【渗透测试】hydra使用小结
  13. vue实现商品购物车全选与全不选项目实战
  14. xgboost-Python&R
  15. EF的三种数据加载方式
  16. H+ 显示并激活menuTab 根据tabName
  17. Python:每日一题003
  18. Android 设备管理API概览(Device Administration API)
  19. debian下配置双核cpu
  20. JS 如何准确获取当前页面URL网址信息

热门文章

  1. vc++中播放声音
  2. 【VS开发】内存映射文件3
  3. 【VS开发】QueryPerformanceFrequency与QueryPerformanceCounter的使用
  4. Charles系列一:Charles功能介绍、下载安装和界面简介
  5. bootstrap基础学习【网格系统】(三)
  6. Django模板及表查询笔记
  7. python的u,r,b分别什么意思?
  8. C语言--单层循环结构
  9. (四)循环队列 VS 数组队列 (效率对比)
  10. vim 插件 入门