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. iOS对键盘的处理
  2. 简单几句话总结Unicode,UTF-8和UTF-16
  3. 服务器程序DEBUG
  4. Linux内核设计第二周——操作系统工作原理
  5. Leetcode: 4Sum II
  6. JavaScript脚本语言基础(四)
  7. PDF表单域(FormField)在HTML显示与提交数据到服务器
  8. 转:Android 2.3 代码混淆proguard技术介绍
  9. 跨域访问之JSONP
  10. 我的coding地址
  11. 团队项目NABCD分析
  12. Mvc_扩展@html
  13. python中利用redis构建任务队列(queue)
  14. 做一次面向对象的体操:将JSON字符串转换为嵌套对象的一种方法
  15. poj 2524 求连通分量(并查集模板题)
  16. 利用Percona monitoring for zabbix监控MySQL
  17. MySQL索引(六)
  18. Struts2---输入验证
  19. MVC 提交List 集合 注意对应的参数名称
  20. 【模拟】【set】hdu 4789 ICPC Ranking

热门文章

  1. K8s 为什么会抛弃 docker
  2. python之路24之 面向对象动静态方法、继承、派生
  3. [C#]C++/CLI中interior_ptr和pin_ptr的区别
  4. 题解P4474 王者之剑
  5. C#高性能数组拷贝实验
  6. pycharm编辑器下载与使用
  7. CAN2-CH32V307CAN2使用说明与CAN波特率计算方法
  8. 线程基础知识14 ReentrantLock和ReentrantReadWriteLock
  9. Ceph RGW误删index对象恢复
  10. servlet传入多个数据