我们所说的Python全局解释锁(GIL)简单来说就是一个互斥体(或者说锁),这样的机制只允许一个线程来控制Python解释器。

这就意味着在任何一个时间点只有一个线程处于执行状态。GIL对执行单线程任务的程序员们来说并没什么显著影响,但是它成为了计算密集型(CPU-bound)和多线程任务的性能瓶颈。

由于GIL即使在拥有多个CPU核的多线程框架下都只允许一次运行一个线程,所以在Python众多功能中其声誉可谓是“臭名昭著”。

在这篇文章中,你将了解到GIL是如何影响到你的Python程序性能的以及如何减轻它对代码带来的影响。

GIL解决了Python中的什么问题?

Python利用引用计数来进行内存管理,这就意味着在Python中创建的对象都有一个引用计数变量来追踪指向该对象的引用数量。当数量为0时,该对象占用的内存即被释放。

我们来通过一个简单的代码演示引用计数是如何工作的:

在上述例子中,空列表对象[ ]的引用计数为3。该列表对象被a、b和传递给sys.getrefcount( )的参数引用。

回到GIL本身:

问题在于,这个引用计数变量需要在两个线程同时增加或减少时从竞争条件中得到保护。如果发生了这种情况,可能会导致泄露的内存永远不会被释放,抑或更严重的是当一个对象的引用仍然存在的情况下错误地释放内存。这可能会导致Python程序崩溃或带来各种诡异的bug。

通过对跨线程分享的数据结构添加锁定以至于数据不会不一致地被修改,这样做可以很好的保证引用计数变量的安全。

但是对每一个对象或者对象组添加锁意味着会存在多个锁这也就导致了另外一个问题——死锁(只有当存在多个锁时才会发生)。而另一个副作用是由于重复获取和释放锁而导致的性能下降。

GIL是解释器本身的一个单一锁,它增加的一条规则表明任何Python字节码的执行都需要获取解释锁。这有效地防止了死锁(因为只存在一个锁)并且不会带来太多的性能开销。但是这的确使每一个计算密集型任务变成了单线程。

GIL虽然也被其他语言解释器使用(如Ruby),但是这不是解决这个问题的唯一办法。一些编程语言通过使用除引用计数以外的方法(如垃圾收集)来避免GIL对线程安全内存管理的请求。

从另一方面来看,这也意味着这些语言通常需要添加其他性能提升功能(如JIT编译器)来弥补GIL单线程性能优势的损失。

Python全局解释锁相关推荐

  1. python全局解释锁_Python GIL 全局解释性锁介绍

    什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...

  2. 什么是python的全局解释锁(GIL)

    什么是python的全局解释锁(GIL) 我们所说的Python全局解释锁(GIL)简单来说就是一个互斥体(或者说锁),这样的机制只允许一个线程来控制Python解释器. 这就意味着在任何一个时间点只 ...

  3. 深入理解Python中的全局解释锁GIL

    深入理解Python中的全局解释锁GIL 转自:https://zhuanlan.zhihu.com/p/75780308 注:本文为蜗牛学院资深讲师卿淳俊老师原创,首发自公众号https://mp. ...

  4. python全栈开发第36天------GIL全局解释锁、死锁现象和递归锁、信号量、Event事件、线程...

    一.GIL全局解释锁 定义:本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一个进程必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,无法并行 用途:因为Cpytho ...

  5. Python培训教程:什么是Python全局解释器锁(GIL)?

    本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...

  6. python gil全局锁_什么是Python全局解释器锁(GIL)?

    python gil全局锁 The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) tha ...

  7. python全局解释器锁 tensorflow_想轻松复现深度强化学习论文?看这篇经验之谈

    近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI和 DeepMind 训练智能体接收人类的反馈而不是传统的奖励信号.本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 ...

  8. Python全局解释器锁GIL与多线程

    Python中如果是 I/O密集型的操作,用多线程(协程Asyncio.线程Threading),如果I/O操作很慢,需要很多任务/线程协同操作,用Asyncio,如果需要有限数量的任务/线程,那么使 ...

  9. python全局解释器锁 tensorflow_Python即将出局?Julia和Swift能取而代之吗?

    上世纪90年代,Python作为一种通用编程语言诞生了.尽管语句简洁,Python在最初十年的使用情况却并不乐观,它也没能真正成为开发者使用的编程语言.当时,Perl是编程首选,Java已在面向对象编 ...

  10. python 全局解释器锁_python全局解释器锁(GIL)

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

最新文章

  1. ​CSRankings年度更新,清华北大包揽AI领域前两名​ | AI日报
  2. 利用tcpdump抓取mysql sql语句
  3. 设置APP版本跟新提示
  4. B - 数据结构实验之查找二:平衡二叉树
  5. mysql计算后精度增大_Mysql用法汇总
  6. 大促场景下云通信高可用、稳定性实战
  7. oracle 修改2个表,oracle学习笔记2:创建修改表
  8. Web开发者必备:Web应用检查清单
  9. java lambda map循环停止_Map 使用 Lambda 的 forEach 实现跳出循环操作
  10. 全国计算机二级雷同卷怎么处理,信息系统项目管理师考试结束后,雷同卷怎么判定你知道吗?...
  11. C#基础系列:实现自己的ORM(构造我自己的ORM)
  12. matlab钢琴音教程,弹琴吧 - 今天聊一聊钢琴扒带及MIDI制作,使用音
  13. wpf DoEvents 用法原理存在的坑推荐方法
  14. 方波通过RC滤波器波形-Matlab仿真
  15. 汉语语法研究参考文献
  16. docker出现 Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use的解决方法
  17. unity怎么制作云飘动_Unity Shader教程之 旗帜飘扬效果的简单实现
  18. 方舟服务器能不能用ce修改器,方舟生存进化CE修改器代码大全
  19. 亚马逊买家号注册流程
  20. 机器学习---sklearn

热门文章

  1. JAVA的序列化不得不说的事
  2. 大规模机器学习:将数据科学引入生产系统架构的典型模式
  3. NodeJS stream 一:Buffer
  4. 苏宁11.11:苏宁易购移动端的架构优化实践
  5. 读取XML字符串到临时表
  6. 谈谈BFC与ie特有属性hasLayout
  7. 广度优先搜索nodeHDU/HDOJ 1242 Rescue 典型的迷宫广度优先搜索题
  8. mysql truncate 日期_(LINQ to Entities)使用日期判断条件Truncate日期函数
  9. 一个完整的Java Web项目需要掌握哪些技术
  10. Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing