GIL 锁或将在 CPython 中成为可选项

哈喽大家好,我是咸鱼

几天前有媒体报道称,经过多次辩论,Python 指导委员会打算批准通过 PEP 703 提案,让 GIL(全局解释器)锁在 CPython 中成为一个可选项

PEP 703 提案主要目标是使 GIL 变成可选项,即允许 Python 解释器在特定情况下不使用GIL
在这里插入图片描述
这将允许 Python 在多核处理器上更好地利用并行性,从而提高多线程程序的性能

PEP 703 提案建议新增一个配置项 --disable-gil ,加了这个选项之后就可以关闭 GIL 锁,如果想要开启 GIL 锁,把 --disable-gil 去掉即可
在这里插入图片描述
关于 PEP 703 提案的具体内容有兴趣的小伙伴们可以去看一下

PEP 703 提案:https://peps.python.org/pep-0703/

接下来我们来看下外媒的这篇报道吧!

原文:https://www.infoworld.com/article/3704248/python-moves-to-remove-the-gil-and-boost-concurrency.html

译文如下:

经过多次辩论,Python 指导委员会打算批准 PEP 703 提案——”使全局解释器锁在 CPython 中可选“

PEP 703 提案是多年来尝试移除 Python GIL 锁的最终结果。GIL 锁的移除消除了多线程的主要障碍,使得 Python 成为真正的多核语言,并且显著提高其并行工作负载的性能

有了 PEP 703 提案,Python 中对多线程和并发的一流支持离成为现实又近了一步

为什么要移除 GIL ?

在 python 中,其内存管理系统通过维护每个对象的引用数量来跟踪对象的使用情况(Python 的引用计数机制)

当对象的引用计数减少为 0 时,系统就会删除该对象

由于 Python 诞生于多处理器系统很少见且多核处理器还未出现的时代,所以这种引用计数机制不是线程安全的

相反,Python 通过一次只允许一个线程访问对象来实现线程安全,这便是 GIL 的目的

这些年来许多项目都尝试移除 GIL,它们确实能够使多线程程序运行地更快,但代价是降低了单线程程序的性能

鉴于绝大多数 Python 应用程序都是单线程,所以这是一个糟糕的权衡。尽管对 GIL 的改进提升了 Pyhton 对多线程应用程序的处理,但仍旧是一个严重的瓶颈

Python 的核心开发人员最终决定从 CPython 中移除 GIL,但前提是它可以在不减慢单线程程序速度的情况下完成

没了 GIL,Python 该如何运行?

当前关于 Python 的无 GIL 版本的提案都提到了使用多种技术来使引用计数线程安全,并且维持单线程程序的速度不变或者仅对其产生最小的影响

下面是一些关于无 GIL 版本的提案:

  • Biased reference counting(带偏见的引用计数)

单个线程访问的对象的引用计数与多个线程访问的对象的引用计数处理方式不同(单线程的更快一点)

由于大多数对象只被一个线程访问,因此对单线程程序的影响被降到最低

  • Immortalization(永生)

某些对象(如 None)永远不会被回收,因此不需要跟踪它们的引用计数

  • Thread-safe memory allocation(线程安全的内存分配)

一个新的 CPython 对象内存分配系统将使垃圾收集器中的对象跟踪更容易,并以线程安全的方式分配内存

  • Deferred reference counting(延迟引用计数)

某些对象(如模块中的顶级函数)的引用计数可以安全地延迟。这样可以节省时间和资源

  • A revised garbage collector(修改后的垃圾收集器)

CPyhton 垃圾收集器清楚循环对象的引用(比如两个或多个对象互相引用)

无 GIL构建对垃圾收集器做了许多更改,例如删除用于跟踪对象的“生成”系统

如何逐步引入无 GIL 的 Python?

实施 PEP 703 是一个长期项目,将会在几年内分成多个阶段进行。在此期间,CPython 解释器先过渡到使 no-GIL 版本可选,然后是支持,最后成为标准

为了实现这个目标,CPython 的开发者将会为 CPython 添加一个实验性的 ’no-GIL‘ 构建模式,以便大家可以在有或没有 GIL 的情况下编译 CPython 的版本

最终,no-GIL 构建将成为默认值

下面则是相关的计划:

1、no-GIL 是可选项

对于 CPython 开发人员和 Python 社区来说,no-GIL CPython 的第一个版本将是实验性

这个实验阶段有几个目标:

  • 首先让 Python 社区的其他成员参与进来。对 Python 的任何重大更改都需要更广泛的Python 社区的支持。实验性版本为 Python 用户提供了一种安全地试验测试其代码的方法,并且能够观察非线程和线程代码的行为方式
  • 其次让 Python 发行版可以选择(而不是”要求“)提供 no-GIL 的 Python。像 Conda 或WinPython 这样的 Python 发行版需要保证与原有的 CPython 兼容。在过渡阶段,安装的时候可以提供常规或者 no-GIL 版本的 CPython 选项,这将允许 Conda 或WinPython 用户选择最适合他们需求的版本
  • 最后确定 no-GIL 项目是否值得。如果社区大规模尝试 no-GIL 的构建后对结果不满意,CPython 核心开发人员保留退出的权利。双重构建意味着在短期内会增加维护负担,但如果 no-GIL 项目被证明不值得,他们也有退路

2、支持 no-GIL Python

下一阶段将提供 no-GIL 构建作为 CPython 支持的替代构建

用户可以选择安装 no-GIL 或 GIL 版本,其中任何一个版本都是正式支持的 CPython 版本,可以接收错误修复、安全补丁和更新

这个阶段的一大目标是设置一个期限,使 no-GIL 成为默认值

这可能与其他 Python 功能的弃用和删除在同一时间线上发生——至少两三个版本,也意味着至少两到三年

3、no-GIL 成为默认

最后阶段是将 CPython 的 no-GIL 版本作为默认版本,并从 CPython 中删除所有与 GIL 相关的代码

”我们不想等待太久“,CPython 核心开发人员 Thomas Wouters 写道,“因为拥有两种通用的构建模式可能会给社区带来沉重的负担(例如,它可以将测试资源和调试场景加倍),但我们也不能急于求成。我们认为可能需要长达五年的时间才能达到这个阶段

移除 GIL 的最大挑战

尽管技术挑战令人生畏,但这项计划的最大挑战不仅仅是技术挑战。更大的问题是如何使 Python 生态系统的其余部分与这些变化保持一致且确保 no-GIL 的 Python 不会产生比它解决的问题更多的问题

根据 Wouters 的说法,”…适应非 GIL 构建所需的第三方代码的任何更改都应该只适用于 GIL 构建(尽管仍然需要解决与旧 Python 版本的向后兼容性问题)“

如上所述,另一个重大挑战是”带领Python社区的其他成员,” Wouters 说,“……确保我们想要做出的改变,以及我们希望他们做出的改变,是可以接受的

“在我们承诺完全切换到 no-GIL 构建之前,我们需要看到社区对它的支持,” Wouters说。“我们不能只是改变默认值,然后期望社区找出他们需要做些什么来支持它”

Python 社区在从 Python 2 过渡到 Python 3 的过程中经历了巨大的成长痛苦,因此任何像移除 GIL 这样的重大更改都必须完全向后兼容

正如 Wouters 所说,“我们不希望再出现 Python 3 的情况。”

不过在危险和挑战之外,还有一个巨大的回报——Python 最终支持了程序员在 21 世纪所期望的并行性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84862.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink如何监听kafka主题配置变更

背景: 从前一篇文章我们知道flink消费kafka主题时是采用的手动assign指定分区的方式,这种消费方式是不处理主题的rebalance操作的,也就是消费者组中即使有消费者退出或者进入也是不会触发消费者所消费的分区的,那么疑问就来了&am…

【CSS】背景图定位问题适配不同机型

需求 如图, 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 , 需要适配不同的机型, 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的, 所以飘带和渐变背景实则两个div 飘带切图如下 , 圆形部分需要契合头像 <view class"box-bg"><…

【脚踢数据结构】链表(1)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

电脑麦克风没声音?

这3招就可以解决&#xff01; 在我们使用电脑录制视频时&#xff0c;有时会遇到一个令人头疼的问题&#xff1a;麦克风没有声音。那么&#xff0c;为什么会出现这种情况呢&#xff1f;更重要的是&#xff0c;我们应该如何解决这个问题呢&#xff1f;本文将介绍3种方法&#xf…

uniapp 使用canvas画海报(微信小程序)

效果展示&#xff1a; 项目要求&#xff1a;点击分享绘制海报&#xff0c;并实现分享到好友&#xff0c;朋友圈&#xff0c;并保存 先实现绘制海报 <view class"data_item" v-for"(item,index) in dataList" :key"index"click"goDet…

利用ChatGPT绘制思维导图——以新能源汽车竞品分析报告为例

随着人们对环境保护的日益关注和传统燃油汽车的限制&#xff0c;全球范围内对新能源汽车的需求不断增长。新能源汽车市场的激烈竞争使得了解各个竞品的特点和优劣成为关键。然而&#xff0c;针对这一领域的详尽竞品分析却常常需要大量时间和精力。 在此背景下&#xff0c;人工智…

【C++】开源:事件驱动网络库libevent配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

Flink多流处理之coGroup(协同分组)

这篇文章主要介绍协同分组coGroup的使用,先讲解API代码模板,后面会结图解介绍coGroup是如何将流中数据进行分组的. 1 API介绍 数据源# 左流数据 ➜ ~ nc -lk 6666 101,Tom 102,小明 103,小黑 104,张强 105,Ken 106,GG小日子 107,小花 108,赵宣艺 109,明亮# 右流数据 ➜ ~ n…

【项目学习1】如何将java对象转化为XML字符串

如何将java对象转化为XML字符串 将java对象转化为XML字符串&#xff0c;可以使用Java的XML操作库JAXB&#xff0c;具体操作步骤如下&#xff1a; 主要分为以下几步&#xff1a; 1、创建JAXBContext对象&#xff0c;用于映射Java类和XML。 JAXBContext jaxbContext JAXBConte…

finfet grid

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 90nm 及以下的工艺都要求储存器&#xff0c;IP&#xff0c;IO 的多晶硅方向必须和标准单元的多晶 硅方向保持一致&#xff0c;无法像过去工艺一样随意旋转方向。在 22nm 及以下…

机器学习可解释性

机器学习可解释性 可解释性重要性可解释性事前与事后可解释模型线性回归可解释性example权重显著性判断 逻辑回归可解释Example 可解释性重要性 机器学习模型在表现良好时&#xff0c;我们不能简单地信任其预测结果而忽略其决策原因。单一指标如分类准确率对现实世界任务来说是…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战&#xff08;10&#xff09;——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中&#xff0c;模型…

2023年第2季社区Task挑战赛升级新玩法,等你来战!

第1季都有哪些有趣的作品&#xff1f; 在大家的共建下&#xff0c;FISCO BCOS开源生态不断丰富完善&#xff0c;涌现了众多实用技术教程和代码&#xff1a;基于数字身份凭证的业务逻辑设计&#xff0c;贡献了发放数字身份凭证的参考实现&#xff1b;提供企业碳排放、慈善公益等…

【idea】点击idea启动没反应

RT 点击idea启动的时候没反应&#xff0c;接着百度报错&#xff0c;基本跟他们的也不一样。 首先我是做版本升级。其次&#xff0c;我之前是破解的。如果你也是跟我一样的话&#xff0c;那问题可能就处在破解上了 解决方式 首先&#xff0c;是跟大部分解决思路一样。先找到项…

苍穹外卖系统07

哈喽&#xff01;大家好&#xff0c;我是旷世奇才李先生 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff0c;回复【项目】获取我为大家准备的项目 最近打算把我手里之前做的项目分享给大家&#…

年至年的选择仿elementui的样式

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"yearPicker"…

CTFSHOW php命令执行

目录 web29 过滤flag web30 过滤system php web31 过滤 cat|sort|shell|\. 这里有一个新姿势 可以学习一下 web32 过滤 &#xff1b; . web33 web34 web35 web36 web37 data伪协议 web38 短开表达式 web39 web40 __FILE__命令的扩展 web41 web42 重定向…

【无标题杭州生物制药公司【阿诺医药】申请纳斯达克IPO上市】

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;杭州生物制药公司阿诺医药&#xff08;Adlai Nortye&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&am…

7个顶级开源数据集来训练自然语言处理(NLP)和文本模型

推荐&#xff1a;使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 NLP现在是一个令人兴奋的领域&#xff0c;特别是在像AutoNLP这样的用例中&#xff0c;但很难掌握。开始使用NLP的主要问题是缺乏适当的指导和该领域的过度广度。很容易迷失在各种论文和代码中&#xff…

unity修改单个3D物体的重力的大小该怎么处理呢?

在Unity中修改单个3D物体的重力大小可以通过以下步骤实现&#xff1a; 创建一个新的C#脚本来控制重力&#xff1a; 首先&#xff0c;创建一个新的C#脚本&#xff08;例如&#xff1a;GravityModifier.cs&#xff09;并将其附加到需要修改重力的3D物体上。在脚本中&#xff0c…