我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python全局解释器锁能做什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python全局解释器锁能做什么

本篇内容主要讲解“Python全局解释器锁能做什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python全局解释器锁能做什么”吧!

悬而未决的问题

每个领域都会有这么一个问题:它难度大、耗时多,仅仅是尝试解决这个问题都会让人震惊。整个社区在很久以前就放弃了这个问题,现在只有少数人在努力试图解决它。对于初学者来说,解决这样高难度的问题,会给他带来足够的声誉。计算机科学领域中的  P = NP 就是这样的问题。如果能用多项式时间复杂度解决这个问题,那简直就可以改变世界了。Python 中最困难的问题比 P = NP  要容易一些,不过迄今仍然没有一个满意的答案,解决这个问题和解决 P = NP 问题一样具有革命性。正因为如此, Python  社区会有如此多的人关注于这个的问题: “对于全局解释器锁(GIL)能做什么?”

Python 的底层

要理解 GIL 的含义,我们需要从 Python 的基础说起。像 C++  这样的语言属于编译型语言,顾名思义,该类型语言的代码输入到编译器,由编译器根据语言的语法进行解析,生成与语言无关的中间表示,***链接成由高度优化的机器码组成的可执行程序。因为编译器可以获取全部代码(或者是一大段相对独立的代码),所以编译器可以对代码进行深度优化。这使得它可以对不同的语言结构之间的交互进行推理,从而做出更有效的优化。

相反,Python 是解释型语言。代码被输入到解释器来运行。解释器在执行之前对代码一无所知;它只知道 Python  的规则,以及如何在执行过程中动态地应用这些规则。它也有一些优化,但是和编译型语言的优化完全不同。由于解释器不能很好地对代码进行推导,Python  的大部分优化其实是解释器本身的优化。更快的解释器自然意味着更快的程序运行速度,而这种优化对开发者来说是免费的。也就是说,解释器优化后,开发者不用修改  Python 代码就可以坐享优化带来的好处。

这是非常重要的一点,这里有必要在强调一下。在同等条件下,Python  程序的运行速度与解释器的“速度”直接相关相关。无论开发者怎样优化自己的代码,程序的执行速度还是受限于解释器的执行效率。很明显,这就是为什么做了如此多的工作去优化  Python 解释器。这大概是离 Python 开发者最近的免费的午餐。

免费午餐结束了

还是没有结束?摩尔定律告诉了我们硬件提速的时间表,同时,整整一代程序员学会了如何在摩尔定律下编写代码。如果程序员写了比较慢的代码,最简单的办法通常是稍稍等待一下更快的处理器问世即可。事实上,摩尔定律仍然是并且会在很长一段时间内是有效的,不过它生效的方式有了根本的变化。时钟频率不会稳定增长到一个高不可攀的速度,取而代之的是通过多核来利用晶体管密度提高带来的好处。想要程序能够充分利用新处理器的性能,就必须按照并发方式对代码进行重写。

大部分开发者听到“并发”通常会马上想到多线程程序。目前,多线程仍是利用多核系统最常见的方式。多线程编程比传统的“顺序”编程要难很多,不过仔细的程序员可以在代码中充分利用多线程的并发性。既然几乎所有应用广泛的现代编程语言都支持多线程编程,语言在多线程方面的实现应该是事后添加上去的。

意外的事实

现在我们来看一下问题的症结所在。想要利用多核系统,Python 必须支持多线程。作为解释型语言,Python  的解释器对多线程的支持必须是既安全又高效的。我们都知道多线程编程带来的问题。解释器必须避免不同的线程操作内部共享的数据。同时还要保证用户线程能完成尽量多的计算。

那么在不同线程同时访问数据时,怎样才能保护数据呢?答案是全局解释器锁。顾名思义,这是一个加在解释器上的全局锁(从互斥量或者类似意义上来看)。这种方式是很安全,但是(对于  Python 初学者来说)这也就意味着:对于任何 Python 程序,不论有多少线程,多少处理器,任何时候都只有一个线程在执行。

许多人都是偶然发现这个事实。网上的讨论组和留言板充斥着来自 Python 初学者和专家提出的类似的问题:为什么我全新的多线程 Python  程序运行得比其只有一个线程的时候还要慢?在问这个问题时,许多人还觉得自己像个傻瓜,因为如果程序确实是可并行的,那么两个线程的程序显然要比单线程要快。事实上,问及这个问题的次数实在太多了,Python  的专家们已经为它准备了一个标准答案:不要使用多线程,请使用多进程。但这个答案比问题本身更加让人困惑:难道我不能在 Python 中使用多线程?在 Python  这样流行的语言中使用多线程究竟是有多糟糕,连专家都建议不要使用。是我哪里没有搞明白吗?

很遗憾,并不是。由于 Python  解释器的设计,使用多线程以提高性能可以算是一个困难的任务。在最坏的情况下,多线程反而会降低(有时很明显)程序的运行速度。一个计算机科学专业的新生就可以告诉你:当多个线程竞争一个共享资源时将会发生什么。结果通常不理想。很多情况下多线程都能很好地工作,对于解释器的实现和内核开发人员来说,不要对  Python 多线程性能有太多抱怨可能是他们***的心愿。

现在该怎么办呢?慌了吗?

我们现在能做什么呢?难道作为 Python 开发人员的我们要放弃使用多线程来实现并行吗?为什么 GIL  在某一时刻只允许一个线程在运行呢?在并发访问时,难道不可以用粒度更细的锁来保护多个独立对象?为什么没有人做过类似的尝试呢?

这些问题很实用,它们的答案也十分有趣。GIL 为很多对象的访问提供这保护,比如当前线程状态和为垃圾回收而用的堆分配对象。这对 Python  语言来说没什么奇怪的,它需要使用一个 GIL 。这是该实现的一种产物。现在也有不使用 GIL 的 Python 解释器(和编译器)。但是对于 CPython  来说,从其产生到现在 GIL 就一直在存在了。

那么为什么我们不抛弃 GIL 呢?许多人也许不知道,1999年的时候,Greg Stein 针对 Python 1.5 提交了一个名为“free  threading”的补丁,这个补丁经常被提到却不怎么被人理解。这个补丁就尝试了将 GIL 完全移除,并用细粒度的锁来代替。然而,GIL  移除的代价是单线程程序的执行速度下降,下降的幅度大概有  40%。使用两个线程可以让速度有所提升,但是速度的提升并没有随着核数的增加而线性增长。由于执行速度的降低,这一补丁没有被接受了,并且几乎被人遗忘。

GIL 让人头痛,我们还是想点其他办法吧

尽管“free threading”这个补丁没有被接受,但是它还是有启发性意义。它证明了一个关于 Python 解释器的基本要点:移除 GIL  是非常困难的。比起该补丁发布的时候,现在的解释器依赖的全局状态变得更多了,这使得移除 GIL 变得更加困难。值得一提的是,也正是因为这个原因,许多人对移除  GIL 变得更感兴趣了。困难的问题通常都很有趣。

但是这可能有点被误导了。我们假设一下:如果我们有这样一个神奇的补丁,它其移除了 GIL ,并且没有使单线程的 Python  代码性能下降,我们会得到一直想要的东西:一个能并发使用所有处理器的线程 API。现在我们已经获得了我们希望的,但这确实是件好事吗?

基于线程的编程是困难的。当一个人觉得自己了解关于线程的一切,总会有一些新问题出现。一些非常知名的语言设计者和研究者站出来反对线程模型,因为在这方面想要得到合理的一致性真的是太难了。就像任何一个写过多线程应用程序的人可以告诉你的一样,不管是多线程应用的开发还是调试难度都会是单线程的应用的指数倍。程序员的思维模型往往适应顺序执行模型,恰恰与并行执行模型不匹配。GIL  的出现无意中帮助了开发者免于陷入困境。在使用多线程时仍然需要同步原语,GIL 事实上帮助我们保证不同线程之间的数据一致性。

这么说起来 Python 最难的问题似乎有点问错了问题。Python 专家推荐使用多进程代替多线程是有道理的,而不是想要给 Python  线程实现遮羞。Python  的这种实现方式促使开发者使用更安全也更直观的方式实现并发模型,同时保留使用多线程进行开发,让开发者在必要的时候使用。大多数人可能并不清楚什么是***的并行编程模型。但是大多数人都清楚多线程的方式并不是***的并行模型。

不要认为 GIL 是一成不变或者毫无道理的。Antoine Pitrou 在 Python 3.2 中实现了一个新的 GIL ,比较显著地改进的  Python 解释器。这是1992年以来,针对 GIL 最主要的一次改进。这个改变非常巨大,很难在这里解释清楚,但是从高层次来看,旧的 GIL 通过对  Python 指令进行计数来确定何时释放 GIL。由于 Python 指令和翻译成的机器指令并非一一对应的关系,这使得单条 Python  指令可能包含大量工作。新的 GIL 用一个固定的超时时间来指示当前的线程释放锁。在当前线程持有锁且第二个线程请求这个锁的时候,当前线程就会在 5 ms  后被强制释放这个锁(这就是说,当前线程每 5 ms 就要检查其是否需要释放这个锁)。在任务可以执行的情况下,这使得预测线程间的切换变得更容易。

然而,这并不是一个***的改进。对于不同类型任务执行过程中 GIL 的作用的研究,David Beazley 可能是最活跃的一个。除了对 Python  3.2 之前的 GIL 研究最深入,他还研究了这个***的 GIL 实现,并且发现了很多有趣的程序方案:在这些方案中,即使是新的 GIL  实现,表现也相当糟糕。他目前仍然通过实践研究来推动着有关 GIL 的讨论,并发布实践结果。

不管人们对 Python 的 GIL 看法如何,它仍然是 Python 语言里最困难的技术挑战。想要理解它的实现需要对操作系统设计、多线程编程、C  语言、解释器设计和 CPython 解释器的实现有着非常透彻的理解。单是这些前提就妨碍了很多开发者去更彻底地研究 GIL。然而并没有任何迹象表明 GIL  会在不久之后远离我们。目前,它将继续给那些新接触 Python 并对解决技术难题感兴趣的人带来困惑和惊喜。

以上内容是基于我目前对 Python 解释器的研究。我打算写一些关于解释器其它方面的内容,但是没有比 GIL 知名度更高的了。虽然这些技术细节来自我对  CPython 代码库的彻底研究,但是仍有可能存在不准确的地方。如果你发现了不准确的内容,请及时告知我,我会尽快修正。

到此,相信大家对“Python全局解释器锁能做什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python全局解释器锁能做什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python全局解释器锁能做什么

本篇内容主要讲解“Python全局解释器锁能做什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python全局解释器锁能做什么”吧!悬而未决的问题每个领域都会有这么一个问题:它难度大、耗时多,
2023-06-17

python全局解释器GIL锁机制详解

我们要知道一点GIL并不是Python的特性,它是Python解释器Cpython引入的一个概念,下面这篇文章主要给大家介绍了关于python全局解释器GIL锁机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-19

Python中GIL全局解释锁如何实现

今天小编给大家分享一下Python中GIL全局解释锁如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.为什么有GIL
2023-07-05

Python GIL(全局解释器锁):揭秘背后的原理和性能影响

Python GIL(全局解释器锁)是 Python 中影响多线程性能的重要机制。它限制了同一时刻只能有一个线程执行 Python 字节码,从而确保了 Python 解释器的稳定性。这篇将深入探究 GIL 的原理和性能影响,并提供克服 GIL 限制的解决方案。
Python GIL(全局解释器锁):揭秘背后的原理和性能影响
2024-02-26

Python GIL入门指南:如何理解和使用全局解释器锁

全局解释器锁(GIL)是Python解释器的一个重要概念,它确保了Python解释器一次只能执行一个线程。本文将介绍GIL的工作原理,以及如何理解和使用GIL。
Python GIL入门指南:如何理解和使用全局解释器锁
2024-02-26

python线程锁和全局锁有什么作用

Python线程锁和全局锁都是用来控制多线程并发访问共享资源的工具,可以确保线程安全地访问共享资源。线程锁是在代码块中使用的锁,它可以确保在同一时间只有一个线程可以访问共享资源。当一个线程获得了锁,其他线程就必须等待这个线程释放锁之后才能
python线程锁和全局锁有什么作用
2024-03-15

Python并发编程中的GIL,理解全局解释器锁对Python并发编程的影响

Python并发编程中的GIL,解读全局解释器锁对Python并发编程的影响 : Python、GIL、并发编程、多线程、性能 Python是一种解释型语言,它的解释器采用单线程模型,即在同一时间只能执行一条指令。为了解决这个问题,Python引入了全局解释器锁(GIL)的概念。GIL是一种同步机制,它确保在同一时间只能有一个线程执行Python字节码。
Python并发编程中的GIL,理解全局解释器锁对Python并发编程的影响
2024-02-05

Python五种Python解释器的表示什么

这期内容当中小编将会给大家带来有关Python五种Python解释器的表示什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多
2023-06-02

云服务器1000g能做什么生意呢安全吗苹果

一、云服务器1000G的安全特性安全访问控制:云服务器1000G采用了强大的访问控制系统,可以对访问权限进行精细控制,确保只有授权用户才能访问相应的服务和数据。此外,云服务器1000G还支持多重认证,如用户名、密码和指纹识别等,以确保安全访问。安全存储:云服务器1000G可以将数据存储在多个位置,包括本地存储、服务器存
云服务器1000g能做什么生意呢安全吗苹果
2023-10-28

Python中的编译器与解释器的作用是什么

本篇内容介绍了“Python中的编译器与解释器的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、数据的表示方式我们都知道,现实生
2023-06-02

python虚拟机解释器及运行过程是什么

今天小编给大家分享一下python虚拟机解释器及运行过程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是pytho
2023-06-30

Python解析器Cpython的GIL锁工作机制是什么

本文小编为大家详细介绍“Python解析器Cpython的GIL锁工作机制是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python解析器Cpython的GIL锁工作机制是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录