Python全局解释锁
我们所说的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全局解释锁相关推荐
- python全局解释锁_Python GIL 全局解释性锁介绍
什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...
- 什么是python的全局解释锁(GIL)
什么是python的全局解释锁(GIL) 我们所说的Python全局解释锁(GIL)简单来说就是一个互斥体(或者说锁),这样的机制只允许一个线程来控制Python解释器. 这就意味着在任何一个时间点只 ...
- 深入理解Python中的全局解释锁GIL
深入理解Python中的全局解释锁GIL 转自:https://zhuanlan.zhihu.com/p/75780308 注:本文为蜗牛学院资深讲师卿淳俊老师原创,首发自公众号https://mp. ...
- python全栈开发第36天------GIL全局解释锁、死锁现象和递归锁、信号量、Event事件、线程...
一.GIL全局解释锁 定义:本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一个进程必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,无法并行 用途:因为Cpytho ...
- Python培训教程:什么是Python全局解释器锁(GIL)?
本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...
- python gil全局锁_什么是Python全局解释器锁(GIL)?
python gil全局锁 The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) tha ...
- python全局解释器锁 tensorflow_想轻松复现深度强化学习论文?看这篇经验之谈
近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI和 DeepMind 训练智能体接收人类的反馈而不是传统的奖励信号.本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 ...
- Python全局解释器锁GIL与多线程
Python中如果是 I/O密集型的操作,用多线程(协程Asyncio.线程Threading),如果I/O操作很慢,需要很多任务/线程协同操作,用Asyncio,如果需要有限数量的任务/线程,那么使 ...
- python全局解释器锁 tensorflow_Python即将出局?Julia和Swift能取而代之吗?
上世纪90年代,Python作为一种通用编程语言诞生了.尽管语句简洁,Python在最初十年的使用情况却并不乐观,它也没能真正成为开发者使用的编程语言.当时,Perl是编程首选,Java已在面向对象编 ...
- python 全局解释器锁_python全局解释器锁(GIL)
什么是全局解释器锁GIL 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译 ...
最新文章
- 手撸 webpack4.x 配置(一)
- 2017年10月31日结束Outlook 2007与Office 365的连接
- MorGain2020中文版
- AsyncDisplayKit
- Spring Boot2.0+中,自定义配置类扩展springMVC的功能
- 软件质量包括哪些特性?软件质量保证的主要任务是什么?
- C++/C--字符串分割函数 --strtok()
- 【OpenCV】OpenCV函数精讲之 -- 初级图像混合
- 杭州市政府数据容灾集中备份业务整体外包(2009)项目招标公告
- Intel 64/x86_64/IA-32/x86处理器指令集 - CPUID (2) - 起源
- 嗅探服务器系统,嗅探服务器
- 【NLP】神经网络语言模型(NNLM)
- 情侣生日纪念日倒数提醒的便签
- 【NLP】from glove import Glove的使用、模型保存和加载
- 主宾国 guest of honor
- 添加APN网络接入点,设置指定网络为默认网络
- QQ号码免费申请的骗术
- 城市生活垃圾类毕业论文文献包含哪些?
- 计算机网络tcp三次握手分析,tcp三次握手及原理
- Illustrator CS绘制矢量精细图标详解
热门文章
- Exchange Server DAG群集状态部分在线
- 看完这篇 你就能完全操作git 远程分支的增、删、改、查了
- BZOJ35453551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
- 浅谈C语言中的强符号、弱符号、强引用和弱引用【转】
- Ruby Tip:定义索引操作符
- 智能指针shared_ptr, auto_ptr, scoped_ptr, weak_ptr总结
- 利用用户自己的server、tomcat下的解决iOS7.1企业应用无法安装应用程序 由于证书无效的问题...
- [c++] polymorphism without virtual function
- mysql replication(主从复制)(二)MSS模式
- [xmind] ASP.NET 设计模式 - UX 用户体验