百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 新提案:“废除”全局解释器锁 GIL | CPython 解释器或会更快

off999 2024-11-25 15:51 24 浏览 0 评论

近日,开发者 Alex Waygood 在 Python 基金会博客中提到了上周刚刚举办的Python 语言峰会上关于 Python 语言的重大议题 —— “废除” Python 语言的全局解释器锁(GIL)。

“双刃剑”:CPython —— 解释器和编译器

众所周知,Python 动态语言的灵活性是把“双刃剑”。这意味着可以有不同的运行时,例如 Pyston、Cinder、MicroPython、pypypy 等,它们可能支持整个语言、特定版本或子集。但如果你使用的是 Python,那么你可能正在运行 CPython。

CPython 是用 C 语言编写的标准 Python 解释器,它同时还充当着编译器,因为它的任务是在实际的解释阶段之前以字节码的形式编译 Python 代码。

CPython 有一种称为全局解释器锁 GIL(Global Interpreter Lock)的东西,可以影响线程代码,即一次只能在解释器中运行一个线程。因此,GIL 一直被看做是该语言发展的固有限制。

之前,也一直有提案想要解决这个问题,例如将性能关键部分移到 C 或使用多个解释器。但要满足以上期望,解释器用户的受众可能会扩大。目前有几种替代方案,例如通过专用于 JVM(Java 虚拟机)和 CLR(公共语言运行时)的方案,但以上多数现有的解决方案都有相当大的缺点。

所以基于以上背景,“不带全局解释器锁的 Python” 的支持声逐渐受到关注。

多次尝试被废除:GIL 究竟该如何摆脱掉

直到此次的 Python 语言峰会上,Meta 高级工程总监 Sam Gross 在有关 “nogil”项目的主题中,提出了“废除 GIL ”的相关议题。

据悉,该提议是基于之前在 Python 中废除 GIL 的想法。Gross 最初在使用第三方代码的 Python 项目中遇到了问题,因此开始思考“如果没有 GIL”的话如何使得线程安全的进行。

前面提到过,全局解释器锁 GIL 一次只能在解释器中运行一个线程,所以当你可以保证一次只运行一个线程时,程序状态或许会更容易推理。但如果没有 GIL,引用计数、内存分配、方法解析顺序缓存和垃圾收集线程则会变得不安全。

那么,该如何摆脱 GIL 呢?

据报道,早前 Sam Gross 就专门对这一演变进行了讨论。由于 CPython 中的设计是“线程安全”,但它依赖于 GIL。想要摆脱 GIL,首先,就要对参考计数进行重大更改。

为了知道垃圾收集器是否可以释放内存中的对象,它会统计对该对象的所有引用。目前,引用计数是非原子性的,将所有引用计数操作更改为原子性操作会对性能造成巨大影响。

Sam Gross 在该提案中使用了一种称为“有偏引用计数”(biased reference counting )的技术,用于获取本地和共享引用。本地引用可以利用非原子性操作,拥有线程将本地引用和共享引用结合起来以跟踪所有权。这种方法非常适用于单线程对象,或者只被几个线程少量使用的对象。

在程序的生命周期中存在几个对象,如插入字符串、True、False 和 None,它们可以被标记为“不朽”(immortal),从而将它们的引用计数开销减少到零。通过利用引用计数字段中的最低有效位,对象被标记为“不朽”。经常访问但不能保证“不朽”的对象延迟了引用计数,这意味着唯一需要的引用计数是当引用存储在堆上时,此更改的一个副作用是无法立即回收对象,因为需要扫描堆栈以查找任何剩余的引用。

Sam Gross 用 mimalloc 替换了标准的 pymalloc 内存分配器,mimalloc 是 malloc 的一个替代品,提供了线程安全和性能。这种交换的好处是,这个分配器允许运行时在没有显式列表的情况下查找 GC 跟踪的对象。这是一个显著的性能提升,但这意味着不能只交换另一个与 malloc 兼容的分配器,而期望垃圾收集和收集具有相同的线程安全性。

Python 尚未决定是否删除 GIL

关于为何要删除 GIL 的问题,Python 基金会博客中解释称,“为了让 Python 在没有 GIL 的情况下有效地工作,必须向大多数代码中添加新锁,以确保其保持线程安全,但向现有代码中添加新锁可能非常困难,因为在某些领域可能会出现大幅放缓。”

此次,Sam Gross “删除 GIL”的新提议似乎已经受到了 Python 核心开发团队其他成员的“热情”欢迎。现在,要解决的主要问题是如何在 CPython 上实施如此巨大的变革。

据悉,CPython 的下一个版本(或为 CPython 3.11)预计将于 2022 年 10 月发布,不知道届时会不会有大更新,但报道称开发人员们尤其希望通过此更新获得更高的性能和对在 web 浏览器上下文中运行的支持的集成。

过去的一段时间里,由于 GIL 阻碍了语言的进发,开发者曾多次尝试在标准实现 CPython 中废除这种技术。此次,“删除 GIL”的新提议终于来了,尽管 Python 官方尚未就实施作出最终决定,但一切依旧值得期待。

相关推荐

如何取消win10开机密码(如何取消win10开机密码账户登录)

取消Windows10的开机密码可以通过以下方法进行操作:方法一:使用用户账户设置1.打开“开始”菜单,点击“设置”图标。2.在设置窗口中,点击“帐户”选项。3.在左侧菜单中,选择“登录选项”。4....

免费解压文件的软件(免费解压文件的软件电脑)

1、快压快压(kuaizip)是一款非常流氓的压缩和解压缩软件,一款免费、方便、快速的压缩和解压缩利器,拥有一流的压缩技术,是国内第一款具备自主压缩格式的软件。快压自身的压缩格式KZ具有超大的压缩比和...

无线usb网卡插上去没有反应(为什么usb无线网卡插上去没反应)

当出现电脑无法识别无线网卡的情况时,是简单的方法就是将无线USB网卡插到电脑后置USB接口上,以保证供电的充足。当然如果是偶然出现无法识别的情况,建议重启一下电脑试试。启用USB无线网卡驱动:右击“计...

怎么登录自己家的路由器(怎么登录自己家的路由器账号)

登陆家里的路由器方法:1、先查看ip,方法:win+r---输入:cmd---在再黑白界面输入:ipconfig,按回车。2、根据网关查看路由器地址。若网关是:192.168.2.1,那么路由器的ip...

linux操作系统安装步骤(linux系统详细安装步骤)

1.选择“中文(简体)”,然后点击“安装Ubuntu”。2.点击“继续”。3.然后点击“现在安装”。4.选择地址的时区,然后点击“继续”。5.选择“汉语”,然后点击“继续”。6.输入用户的名字。7.设...

苹果手机怎么设置定时关机(苹果手机怎么设置定时关机重启)

苹果手机可以设置定时关机,但无法设置定时开机。具体操作步骤如下:进入苹果手机自带的时钟。点击屏幕有下角的计时器。点击画面中间的计时结束启用选项。选择画面最下方的“停止播放”。之后再点击画面右上角的设定...

无线网wifi密码忘记了怎么办

忘记wifi密码后,可以在路由器后台查看。1.在浏览器的地址栏中,输入路由器上的管理地址,进入后台界面;2.在后台界面里,找到“无线设置”选项,点击它;3.在新界面里,点击wifi密码右侧的小眼睛图标...

win7系统无法正常开机怎么办
win7系统无法正常开机怎么办

解决方法如下1,出现无法启动的原因,要注意是开机启动不了,还是在进度条那里缓冲,过不去.如果是开机启动不了,那就要看一下内存条、电源等有没有问题?如果是在进度条那里,那就看下方的三种方法。2,第一种方法:1,开机按F8键.2,选择最近一次的...

2025-11-16 07:51 off999

现在装win7还需要激活吗(现在安装win7旗舰版还需密钥吗)

要激活  Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...

2025显卡性能排行榜天梯图(2020年显卡性能天梯图)

MacBookPro的显卡水平处于笔记本独立显卡Nvidia920M和940M之间。属于低端显卡级,玩玩LOL啥的还可以,其他的大型游戏就算了,MAC不适合打游戏。MacBookPro搭载的8代...

网络对时服务器(对时服务器端口)

对等网是指在网络中所有计算机的地位都是平等的,既是服务器也是客户机,所有计算机中安装的都是相同的单机操作系统如Windows98/XP/Vista/7等,它可以设置共享资源,但受连接数限制,一般是只允...

如何强制删除u盘文件(强制删除u盘内容)

1、电脑上下载安装安全杀毒类软件。2、使用强力卸载。3、找到U盘上需要卸载的文件,右击强力卸载可以卸载顽固型文件。4、被暂用的文件也删除不了可以退出U盘重启电脑重新开机插入U盘进行删除。5、不能删除的...

directx官方下载win7(directx download)

点开始-----运行,输入dxdiag,回车后打开“DirectX诊断工具”窗口,进入“显示”选项卡,看一下是否启用了加速,没有的话,单击下面的“DirectX功能”项中的“启用”按钮,这样便打开了D...

u盘视频无法播放怎么办(u盘上视频没办法播放)

解决办法:1.检查U盘存储格式是否为FAT32,如果不是,请将其格式化为FAT32; 2.检查U盘中视频文件是否损坏,如果有损坏文件,请尝试重新复制一份; 3.检查U盘中存储...

笔记本电脑无法正常启动怎么修复
笔记本电脑无法正常启动怎么修复

1.可以解决。2.Windows未能启动可能是由于系统文件损坏、硬件故障或病毒感染等原因引起的。解决方法可以尝试使用Windows安全模式启动、修复启动、还原系统、重装系统等方法。3.如果以上方法都无法解决问题,可以考虑联系专业的电脑...

2025-11-16 04:03 off999

取消回复欢迎 发表评论: