2019的暑假又准备用Python做个小项目,由于项目涉及高并发特性需要了解一下Python里的多线程与多进程,难免就会了解到CPython里的GIL(Global Interpreter Lock,全局解释器锁),这里想解决一下初次了解GIL可能会提及的一些问题。

什么是GIL?

GIL确保了单个解释器只有一个线程在执行字节码(bytecode),即保证了在字节码层面上Python是线程安全的。对CPython而言单个解释器即对应一个进程,意味着GIL使得Python上的多线程沦为一纸空谈。当我们执行Python代码的时候,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户。

首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用户键入关键字或者当输入关键字有误时,都会被词法分析所触发,不正确的代码将不会被执行。

下一步Python会进行语法分析,例如当"for i in test:"中,test后面的冒号如果被写为其他符号,代码依旧不会被执行。

下面进入最关键的过程,在执行Python前,Python会生成.pyc文件,这个文件就是字节码,如果我们不小心修改了字节码,Python下次重新编译该程序时会和其上次生成的字节码文件进行比较,如果不匹配则会将被修改过的字节码文件进行覆盖,以确保每次编译后字节码的准确性。

那么什么是字节码?字节码在Python虚拟机程序里对应的是PyCodeObject对象。.pyc文件是字节码在磁盘上的表现形式。简单来说就是在编译代码的过程中,首先会将代码中的函数、类等对象分类处理,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码文件进行处理,接着Python就可执行了。

GIL处理多线程的策略有很多,如当前线程阻塞超过一定时间后切换,或遇到长时IO操作时切换等。

为什么有了GIL还需要线程同步?

初看有了GIL,其他用于线程同步的手段(线程锁)就失去了存在的意义,实则不然:GIL确保了字节码层面上的线程安全,但某些数据操作无法用一条字节码实现(类比C中一行代码编译后并不只对应一项汇编操作),以最简单的x = x + 1为例,无论是C还是Python都有以下步骤:tmp = x + 1

x = tmp

对于这些对应多个字节码的数据操作,仅在字节码层面上的线程安全无法保证数据的可靠性,如线程1执行完字节码1后切换到其他线程,由于线程之间的数据共享,此时数据的一致性很难得到保证。

为什么CPython设计了GIL?

GIL在Python社区中饱受诟病,也有部分不带GIL的Python解释器实现应运而生,那为何CPython当初设计了GIL呢?

官方wiki如此道:单线程情况下更快。

瓶颈在于 I/O 的多线程环境下更快。

CPU 耗时操作发生在 C 库调用上时更快。

编写 C 扩展会更容易:除法你手动指定,否则不会发生 Python 线程切换的问题。

封装 C 库变得更容易,因为不需要考虑线程安全问题。如果该库不是线程安全的,你只需要保证调用时 GIL 是锁定的。

还有一种广为流传的说法:CPython当初在90年代被设计时,多核技术应用很少,GIL的弊端没有如今这么明显。要真是这样,不知能不能说软件设计时开发人员还是得有一定的远见的。

wiki的说法也坐实了Python胶水语言的特性:业务流程用Python,核心模块用C/C++,今后的项目大家也可以尝试充分地利用起Python的胶水性质。使用C++扩展的Python实例

cpython gil_什么是GIL?为什么有了GIL还需要线程同步?为什么CPython设计了GIL?相关推荐

  1. python线程安全吗_线程安全及Python中的GIL

    什么是 GIL ? 答案可参考wikipedia中的说明, 简单地说就是: 每一个interpreter进程,只能同时仅有一个线程来执行, 获得相关的锁, 存取相关的资源. 那么很容易就会发现,如果一 ...

  2. 线程与全局解释器锁(GIL)

    一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资源集中到一起(进程只是一个资源 ...

  3. Python中的GIL(全局解释器锁)

    1. GIL全称Global Interpreter Lock,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码. 2.GIL的缺点 GIL使Python不能充分利用多核心 ...

  4. python GIL 全局解释器锁详解

    Python多线程另一个很重要的话题--GIL(Global Interpreter Lock,即全局解释器锁)鲜有人知,甚至连很多Python老司机都觉得GIL就是一个谜 一.一个不解之谜 耳听为虚 ...

  5. python gil锁存在的意义_对于Python的GIL锁理解

    GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可 ...

  6. 理解python的GIL

    UnderstandingGIL 个人笔记,有一点点修改,不喜右上角. 理解python的GIL 介绍 一个实验 结果 线程与GIL Python Threads 线程执行模型 cpu密集型任务 什么 ...

  7. 【Python核心】全局解释器锁GIL

    Python多线程另一个很重要的话题--GIL(Global Interpreter Lock,即全局解释器锁)鲜有人知,甚至连很多Python老司机都觉得GIL就是一个谜 一.一个不解之谜 耳听为虚 ...

  8. Python GIL锁

    最近在看 Python 的多线程,经常我们会听到老手说: "python下多线程是鸡肋,推荐使用多进程!" ,但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究 ...

  9. java gil,Python中的GIL机制详解

    大家应该都知道,python有一个GIL(全局解释器锁),用于控制多线程的并发行为. 注:GIL不是必须的,可以通过对每个资源单独加锁的方式去掉GIL,也就是将GIL换成更细粒度的锁. GIL锁的实现 ...

最新文章

  1. python执行mysql多个sql语句_mysql -- 一次执行多条sql语句
  2. python坐标柱染色_Python matplotlib:在数据坐标中定位colorbar
  3. Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略
  4. 用汇编的眼光看C++(之判断流程)
  5. 一文读懂常用开源许可证
  6. 硬盘损坏如何恢oracle,硬盘物理损坏,如何恢复数据库?
  7. linux编程之指针
  8. IDEA中控制台中文乱码问题
  9. Eclipse Debug 配置
  10. mysql客户端新建一个表_MySQL 建库、建用户及建表事项
  11. 谷歌翻译失败解决方案
  12. 37,字节跳动Python面试
  13. 新手必看:PS软件入门基础知识
  14. 企业征信查询工具--企信宝
  15. 最新小学计算机课五年级上册目录,部编版小学语文教材2020最新调整!涉及20多篇课文!(附2020年教育部中小学生阅读指导目录)...
  16. python matrix用法_numpy中matrix使用方法
  17. 团队协作工具,如何加强团队协作能力
  18. 云计算是什么,物联网是什么,它们之间有什么关系?
  19. 荣耀8怎样修改wifi服务器,手机怎么设置荣耀路由器wifi密码?
  20. 性能测试第七课--用户定义变量用户参数

热门文章

  1. CMMI2.0之我见-技术解决方案TS产品集成PI
  2. 拓扑结构和几何结构的区别
  3. 软件测试行业薪资排名第五!一线城市,月薪多少才够上了及格线?
  4. 2017西安php行业工资,西安2020冬季平均工资出炉!基金、IT服务这些行业薪资高...
  5. 应用楼宇自控系统降低建筑物设备成本
  6. 如何成为数字化人才?
  7. 【高德地图进阶】--- 3d城市版块之prism
  8. matlab-信号与系统
  9. Unity修改批量修改名字工具
  10. c语言 最大公约数 最小公倍数的编程,C语言三种算法求解最大公约数与最小公倍数...