这一次,Python 真的有望告别 GIL 锁了?

news2025/1/4 8:34:55

Python 中有一把著名的锁——全局解释器锁(Global Interpreter Lock,简写 GIL),它的作用是防止多个本地线程同时执行 Python 字节码,这会导致 Python 无法实现真正的多线程执行。(注:本文中 Python 解释器特指 CPython)

这把锁在 Python 的早期发展中具有积极的作用(单核 CPU 时代),然而,它阻碍了 Python 在多核 CPU 上的并行编程,引起了开发者们与日俱增的诟病。

GIL 影响的主要是 CPU 密集型任务,比如科学计算与数值计算任务。

在最近发布的 PEP-703 中,它概括了 GIL 对科学计算(主要是 AI/ML)造成的四类问题:

  • GIL 导致许多并行化操作难以表达(影响强化学习、DeepMind、医学治疗及生物研究等领域)

  • GIL 影响了 Python 库的可用性(例如 PyTorch、scikit-learn、NumPy)

  • GIL 导致无法充分利用 GPU 资源(例如计算机视觉任务)

  • GIL 导致难以部署 Python AI 模型(例如基于神经网络的 AI 模型)

社区中想要移除 GIL 的呼声以及尝试,此起彼伏,绵绵不绝,但这个话题一直悬而未决。

抱怨、质疑、不满、不甘、期盼等这些诸多的情绪,不是那么容易平息的。然而,从一个积重已久的庞大的项目中移除一个根基性的设计,又谈何容易?

2023 新年刚过,这个话题又一次热了起来,又一轮对 GIL 的挑战开始了。

这一次,事情似乎有了新的转机,这次也许能成功了呢?

PEP-703

PEP-703 在今年 1 月 9 日新鲜出炉,虽然它目前仍是“草案”状态未被采纳,但是这份 PEP 的意义十分重大!

(注:每个 Python 学习者都应该基本了解 PEP,建议阅读《学习Python,怎能不懂点PEP呢?》)

这个 PEP 的作者是 Sam Gross,他是 nogil 项目的作者。Python猫的老读者应该有印象,我们在 2021 年曾翻译过他与 Python 核心开发者们的一次研讨会的纪要,这份纪要里概括了 nogil 的主要设计思路,同时回答了核心开发者们最为关注的约 20 个问题。

经过一年多时间的沉淀,nogil 项目现在终于形成了正式的 PEP,这意味着它被采纳进 Python 主分支的可能性变大了一些啦!

PEP 的标题是《使 CPython 的 GIL 成为可选项》(Making the Global Interpreter Lock Optional in CPython),内容详实,正文超过 1 万字,这个体量的 PEP 绝对够得上排在所有 PEP 的前十了。

简单而言,这份提案提议给 CPython 增加一个构建时配置项--disable-gil ,作用是构建出一个线程安全的无 GIL 的解释器。

为了实现无 GIL 的解释器,Python 底层的部分设计必须作出变更,内容可以概括成四类:

  • 引用计数

  • 内存管理

  • 容器线程安全

  • 锁和原子 API

如果这份 PEP 被采纳实现的话,它会带来一个不容忽视的问题:Python 将发布两个不同版本的解释器,而第三方库也要相应地开发/维护/发布两个版本的软件包。

PEP-703 的作者也考虑到了这个问题,他提出的解决方案是与 Anaconda 一起发布无 GIL 的 Python,同时在 conda 里集中发布管理那些兼容了新 Python 的库。

考虑到 Anaconda 在科学计算与数值计算领域的强大影响力,此举既能较好地发挥 nogil Python 的用处,又能减少用户及三方库开发者面对两种发行版时的割裂感。

值得注意的是,nogil 的 Python 还有一个更大的问题,那就是会影响单线程程序的性能。

基于 Python 3.11 版本,实现了有偏见的引用计数及永生对象后,Python 单线程性能会变慢 10%。

尽管这个数值在最新的 nogil 原型版本上可以降低到 5%,但是,另外至少还有两项难以规避的性能下降点:

  • 2% - 全局的自由列表(主要是元组和浮点数自由列表)

  • 1.5% - 集合中每个对象的互斥锁(字典、列表、队列)

单线程的代码才是最广泛的使用场景,可以说这会影响到每一个 Python 用户。任何试图移除 GIL 的项目都不可避免要面临这项挑战。

尽管存在着以上的两大问题,但 PEP-703 还是很有可取之处的。

比如,相比于 2015 年提出的著名的 Gilectomy 项目(由 GIL ectomy 两个单词组合而成,ectomy 是一个医学上的术语“切除术”),nogil 在单线程的性能上要快得多,同时可扩展性也更好。

比如,相比于 2021 年火热的“香农计划”的作者 Eric Snow 提出的 PEP-684 方案(给每个子解释器创建 GIL),后者一方面需要实现作为前提的多个 PEP(如 PEP-554、PEP-683),另一方面需要用户处理多子解释器间共享变量的麻烦。

PEP-684

在香农计划的《Python 3.12 目标》中,PEP-554 与 PEP-684 已经囊括在内了,版本目标是充分利用 Python 的子解释器,让子解释器使用各自的 GIL,从而实现多线程的并行。

好消息是,3.12 的计划跟本文的主角  PEP-703 并不冲突。事实上,它们的很多设计细节是一致的,也就是说,这两套对于 GIL 的改造方案是可以共存的,它们相互促进,事半功倍!

香农计划有 Python 之父 Guido van Rossum 站台,还有财大气粗的微软支持着一支豪华的团队投入开发(含 Guido 和 Eric Snow),因此,多解释器多 GIL 的方案很可能会更快落地。

PEP-703 的讨论

而 PEP-703 有 PSF 首位全职开发者 Łukasz Langa 的倾力支持,社区的反响也不错,我觉得它今后落地的希望也挺大!

无论如何,这次香农计划和 PEP-703 掀起的对 GIL 的挑战,比以往所有的尝试都更猛烈,更有成功的可能,让人不由得心生欢欣之喜~~

但愿它们实现的一天不会太远吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TexSpire-比markdown更为简洁的文本标记语言,用文字即可生成演示效果

文章目录 一、前言二、语言特点三、举例1、文本框2、表格3、折线图4、思维导图 四、相关资料 一、前言 老实说,本人对于ppt的花里胡哨深恶痛绝,特别是每一次汇报,都需要花费我很多时间去找模板,去设计,去美化内容时&a…

【源码分析系列】number-precision和bignumber.js

01_JS精度 好久前在公司分享的文章,现在才发…本文阐述了为什么0.1 0.2 ! 0.3,并分析了number-precision和bignumber.js的解决原理 被JS精度问题小坑了一把,所以系统来 复习 学习一波~ 背景 在实际业务开发中,可能会遇到一下问题…

Redis_简介(1)

目录 Redis简介 Redis特性 Redis 优势 Redis应用场景 源码等资料获取方法 Redis简介 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由…

Git命令-状态与版本查看

Git是一个强大的分布式管理系统,版本控制主要在本地端完成,在团队合作和协助开发中,都在广泛使用Git工具,因为他免费哈哈哈 目录 git status git reflog git reset --hard 版本号 git status 可以查看当前git状态 On branch master 是你当前的分支状态,当前我是在master主…

[分布式] zookeeper集群与kafka集群

目录 一、Zookeeper 概述1.1 Zookeeper定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制 二、 部署 Zookeeper 集群2.1 环境部署2.2 关闭防火墙2.3 安装 JDK 下载安装包 安装 Zookeeper2.4 修改配置文件2.5 将…

[NGINX] NGINX下载、安装编译、启动检查停止命令

一、NGINX 下载 mkdir -p /soft/nginx cd /soft/nginx wget https://nginx.org/download/nginx-1.21.6.tar.gz二、下载相关依赖 ①在线安装依赖: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel ②下载依赖到本地安装依赖: y…

2023年7月23日 星期三 Linux驱动作业

1.使用驱动代码实现如下要求 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1再次按下按键number0 d.在按下按键的时候需要同时将1ed1的状态取反 e.驱动中需要编写字符…

FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

本文介绍了不同源单表-单表同步,不同源多表-单表同步。 注:此版本支持火焰图 Flink版本:1.17.1 环境:Linux CentOS 7.0、jdk1.8 基础文件: flink-1.17.1-bin-scala_2.12.tgz、 flink-connector-jdbc-3.0.0-1.16.…

LeetCode·每日一题·2544. 交替数字和·模拟

作者:小迅 链接:https://leetcode.cn/problems/alternating-digit-sum/solutions/2341276/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-7fjq/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权&#…

产品经理学习画原型(三)

1.布尔运算的使用 合并必须选择两个及以上元件 合并后: 组合: 去除顶层:

【基于FPGA的芯片设计】32位RISC-V存储器

实验板卡:xc7a100tlc sg324-2L,共20个开关 实验要求

述往思来,砥砺前行—易我文化系列课《企业发展历程》讲座圆满举行

2023年6月9日,易我文化系列课《企业发展历程》讲座如期举行并取得圆满成功。 此次讲座邀请了易我客服总监——喻涛为大家授课,旨在让员工对易我的历史、发展以及未来有更全面的认识,引导员工从易我发展史中汲取奋进力量,增强集体…

【kubernetes系列】Kubernetes之ServiceAccount

概述 Service Account是什么呢,顾名思义,服务账号,一种给服务使用的账号,它不是给Kubernetes的集群的用户(系统管理员、运维人员、租户用户等)使用,而是给运行在Pod里的进程用的,它…

【雕爷学编程】Arduino动手做(113)---5110液晶屏模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

基于springboot+Redis的前后端分离项目(八)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 好友关注&Feed流 (一)好友关注-关注和取消关注(二)好友关注-共同关注(三) 好友…

飞行动力学 - 第7节-part1-起飞性能 之 基础点摘要

飞行动力学 - 第7节-part1-起飞性能 之 基础点摘要 1. 气动特性2. 起飞性能3. 性能指标3.1 地面滑跑阶段3.2 起飞滑跑距离估算 4. 跑道4.1 编号4.2 等级 5. 参考资料 1. 气动特性 起飞不仅需要考虑升力,还需要在有限跑道长度上加速,因此襟翼放出的角度不…

3Ds max入门教程:创建尼亚加拉大瀑布模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 初学者在3ds Max中为尼亚加拉大瀑布建模 这次您将学习通过几个简单的步骤在3ds max中对尼亚加拉大瀑布(从远处看起来很逼真)进行建模。所以,让我们开始吧! …

JavaScript定时器(setTimeout和setInterval)的用法技巧

1.满足特定条件时才执行后续步骤。 核心代码: //初始化let isPass false;//只有满足特定条件(在这里为:isPass为true时)时,才执行下一步操作let timeout setInterval(() > {if (isPass) {//这里写要执行的后续方…

Kubernetes 入门篇上

❖ Kubernetes核心概念 ❖ 快速部署一个Kubernetes集群 ❖ Kubernetes将弃用Docker! ❖ kubectl管理工具 ❖ Kubernetes基本资源概念 ❖ 资源编排(YAML) ❖ 深入理解Pod对象:基本管理 ❖ 深入理解Pod对象:调度 …

Chapter 6: Loops and Iterations | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Loops and IterationsUpdating variablesThe while statementInfinite loopsFinishing iterations with continueDefinite loops using forLoop patternsCounting and summing loopsMaximum and minimum loopsDebuggingGlossary Python f…