广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 有可能删除 GIL 吗?
  • 454
分享到

Python 有可能删除 GIL 吗?

2024-04-02 19:04:59 454人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录GIL 的起源尝试消除 GIL积重难返为什么 python3 一开始时不去除 GIL最后的话我们知道,在 Cpython 中,有一个全局解释器锁,英文叫 global inter

我们知道,在 Cpython 中,有一个全局解释器,英文叫 global interpreter lock,简称 GIL,是一个互斥锁,用来保护 Python 世界里的对象,防止同一时刻多个线程执行 Python 的字节码,从而确保线程安全,这导致了 Python 的线程无法利用多核 CPU 的优势,因此有人说 Python 的多线程是伪多线程,性能不高,那么 Python 将来有可能去除 GIL 吗?

要回答这个问题,先从 GIL 的起源进行分析。

GIL 的起源

Python 第一次发布是在 1991 年,当时的 CPU 都是单核,单核中,多线程主要为了一边做io,一边做 CPU 计算而设计的,Python 编译器是由 C 语言编写的,因此也叫 CPython,那时候很多编程语言没有自动内存管理的功能,为了实现自动垃圾回收,Python 为每一个对象进行了引用计数,当引用计数为 0 的时候说明该对象可以回收,从而释放内存了,比如:


>>> import sys
>>> data = { 'gzh': 'Python七号'}
>>> var1 = data
>>> sys.getrefcount(data)
3
>>> 

这里 data 对象就有 3 个引用, 一个是本身,一个是变量 var1,一个是 getrefcount 函数的参数,如果此时又有一个线程引用了 data,那么引用计数再增加 1,如果某个线程使用了 data 后运行结束,那么引用计数就减少 1,多线程对同一个变量「引用计数」进行修改,就会遇到 race conditions(竞争),为了避免 race conditions,最简单有效的办法就是加一个互斥锁。

如果对每一个对象都加锁,有可能引发另一个问题,就是死锁,而且频繁的获取和释放会导致性能下降,最简单有效的方法就是加一个解释器锁,线程在执行任何字节码时都先获取解释器锁,这就避免了死锁,而且不会有太多的性能消耗。当时 CPU 都是单核,而且这种 GIL 设计简单,并不会影响性能,因此一直沿用至今天。GIL 存在最主要的原因,就是因为 Python 的内存管理不是线程安全的,这就是 GIL 产生并存在的主要缘由。

尝试消除 GIL

CPU 进入多核时代后,可以同时做多个计算任务, GIL 才真正变成问题。在 1999 年,有个叫 Greg Stein 的大佬基于 Python 1.5 版本消除了 GIL,取代代之的是在可变数据结构上加上更细粒度的锁,也提交了补丁用于去除对全局可变对象的依赖,然后在标准测试时表明去除 GIL 后单线程比不去除时慢了近 2 倍,测试的机器还是当时性能最好 windows 机器。也就是说除去了 GIL 后,你使用 2 个 CPU 才能获取比原来 1 个 CPU 稍微好一点的性能,这种提升明显得不偿失,Greg Stein 的尝试也就失败告终。

Python 之父 Guido van Rossum 也欢迎社区的志愿者去尝试去除 GIL,只要不降低单线程的性能,但他也提到,去掉 GIL 不是一件容易的事。

Python 开发者邮件列表中也偶尔会有去除 GIL 的议题,但是以下需求必须满足:

  1. 简单。从长远来看该方案必须是可实施、可维护的。
  2. 并发。去除 GIL 必须能提升多线程的性能。
  3. 速度。去除 GIL 不能降低单线程的性能。
  4. 满足 CPython 的特性。该方案必须支持 CPython 的功能,比如 __del__ 和弱引用。
  5. api 的兼容性。该方案应与所有现有CPython扩展使用的宏在源方面兼容。
  6. 及时销毁不可达对象,回收内存。
  7. 有序销毁,比如不可达对象 X 引用了 A,那么应该在销毁 A 之前先销毁 X(有些垃圾回收算法并不能做到这一点)。

有些需求不容易被满足,比如 4,5,7,目前,还没有人满足以上需求的同时去除 GIL 成功的。

积重难返

这些年 Python 实在太火了,很多优秀的库都是基于 CPython 进行编写的,很多都是 90 年代的 C 扩展库,如果要除去 GIL,那么很多基于 GIL 编写的 C 扩展便无法使用,也就是去了 GIL,Python 生态有很多扩展或三方库者无法使用。

还有一个很明显的例子,Python 解释器不止有 CPython,还有用 Java 编写的 Python,.net 实现的 IronPython,这些解释器完全没有 GIL,可是有多少人为它们编写扩展呢?

Python 之所以如此火爆,与它有着丰富的三方库开箱即用有着很大的关系,积重难返,去除 GIL 很困难。

为什么 Python3 一开始时不去除 GIL

Python3 在最开始时是有机会实现很多新功能,在此过程中,打破了一些现有的 C 扩展,然后需要更新和移植更改以配合 Python 3,这也是 Python3 一开始不被社区所接受的原因。

与 Python2 相比,删除 GIL 将使 Python3 在单线程性能方面更慢,而且很多优秀的扩展将不能再使用,如果真的这样,可以想象 Python3 不可能有未来,最终的结果是 Python3 仍然保持有 GIL。

但 Python3 也为现有的 GIL 带来了重大改进,在 Python 3.2 版本中,确保了计算密集型线程和 I/O 密集型线程并存时, I/O 密集型长期获取不到 GIL 而无法执行的问题,提升了多线程的性能。

最后的话

Python 因为内存管理不是线程安全的,因此自出生起就自带 GIL,然后很多扩展都是在 GIL 的保护下编写的,时间一长积重难反,Python3 一开始也因去除 GIL 导致单线程性能下降的问题而保留 GIL,现在已经是 Python3.9 版本了,将来 Python 去除 GIL 的可能性微乎其微,换句话说,去除 GIL 的 Python 也就不是我们认识的 Python 了。

不过不必沮丧,GIL 影响的也仅仅是多线程执行计算密集型的任务罢了,这种场景大多数程序员都很少遇到,即使有,可以使用多进程来避免 GIL 的影响,或者使用其他编程语言实现,任何编程语言或技术都不是十全十美的,发挥所长是最重要的,即使有 GIL,我也不在乎,也会依然使用 Python。

以上就是Python 有可能删除 GIL 吗?的详细内容,更多关于Python 删除 GIL 的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python 有可能删除 GIL 吗?

本文链接: https://www.lsjlt.com/news/122172.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python 有可能删除 GIL 吗?
    目录GIL 的起源尝试消除 GIL积重难返为什么 Python3 一开始时不去除 GIL最后的话我们知道,在 CPython 中,有一个全局解释器锁,英文叫 global inter...
    99+
    2022-11-11
  • Python会不会删除GIL
    本篇内容介绍了“Python会不会删除GIL ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道,在 CPython 中,有一个全局解释...
    99+
    2023-06-15
  • minidump.dmp可以删除吗
    minidump.dmp文件不建议删除。原因有:1、它可以提供有关系统崩溃或错误的重要信息;2、它在分析和调试软件或硬件问题时非常有用;3、它文件能够提供有关系统性能的宝贵数据。minidump.dmp是Windows操作系统中的一种文件,...
    99+
    2023-07-12
  • Pagefile.sys可以删除吗
    Pagefile.sys是Windows操作系统中的虚拟内存文件,用于辅助系统管理内存。通常情况下,不建议直接删除该文件,因为它对系...
    99+
    2023-08-21
    Pagefile.sys
  • drivergenius能删除吗
    drivergenius可以删除。驱动精灵是一个功能强大且备受推崇的驱动管理和优化工具,但有时需要卸载和删除它。记住,在执行任何操作之前,备份数据是非常重要的,以防止意外的数据丢失。在使用之前,用户需要谨慎考虑其付费模式和潜在的安全风险,并...
    99+
    2023-08-14
  • windows softwaredistribution可以删除吗
    这篇文章主要讲解了“windows softwaredistribution可以删除吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows softwaredistribution可...
    99+
    2023-07-01
  • php 删除json 可以吗
    本文操作环境:Windows7系统、PHP7.1、Dell G3。php 删除json 可以吗想通过命令删除红色方框内的数据,怎么操作?代码如下:<php $json_data = '{....}'; $data = ...
    99+
    2020-12-06
    php json
  • hiberfil.sys win10可以删除吗
    这篇文章主要讲解了“hiberfil.sys win10可以删除吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“hiberfil.sys win10可以删除吗”吧!hiberfil.sys ...
    99+
    2023-07-01
  • windows winsxs可以删除吗
    这篇文章主要介绍了windows winsxs可以删除吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows winsxs可以删除吗文章都会有所收获,下面我们一起来看看吧。winsxs可以删除吗:win...
    99+
    2023-07-01
  • windows backup可以删除吗
    本文小编为大家详细介绍“windows backup可以删除吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows backup可以删除吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。backup是什么...
    99+
    2023-07-02
  • microsoft visual c++可以删除吗
    本文小编为大家详细介绍“microsoft visual c++可以删除吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“microsoft visual c++可以删除吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-05
  • windows spacesniffer蓝色可以删除吗
    本篇内容介绍了“windows spacesniffer蓝色可以删除吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spacesniffer...
    99+
    2023-07-01
  • java可以删除list元素吗?
    java可以删除list元素,下面给大家介绍一下java删除list元素的几种方法。方式一:使用Iterator的remove()方法public class Test { public static void main(Strin...
    99+
    2017-08-01
    java list
  • php可以删除记录图片吗
    这篇文章主要介绍“php可以删除记录图片吗”,在日常操作中,相信很多人在php可以删除记录图片吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php可以删除记录图片吗”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-25
  • 电脑ntuser.dat文件可以删除吗
    本篇内容介绍了“电脑ntuser.dat文件可以删除吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ntuser.dat是什么文件可以删除吗...
    99+
    2023-06-30
  • php能删除记录图片吗
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php能删除记录图片吗?php 删除记录同时删除图片文件的实现代码: $cn = mysql_connect('127.0.0.1','root&...
    99+
    2017-09-01
    php
  • windows的hosts文件能删除吗
    本篇内容介绍了“windows的hosts文件能删除吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!hosts文件能不能删除:问:hosts...
    99+
    2023-07-01
  • php可以删除html标签内容吗
    本文操作环境:windows7系统、PHP7.1版、Dell G3电脑。php可以删除html标签内容吗php删除html标签和标签内的内容的方法经常扒别人网站文章的坑们;我是指那种批量式采集的压根不看内容的,少不了都会用到删除html标签...
    99+
    2015-01-12
    php
  • 手机里的html文件可以删除吗
    随着现代社会的进步,手机已经成为我们日常生活中不可或缺的重要工具之一。我们经常使用手机上网、下载文件甚至是创建自己的个人网站等等,其中也包括了创建一些HTML文件。但是,很多人都不知道这些HTML文件可以删除吗?首先,让我们来了解一下HTM...
    99+
    2023-05-14
  • appdata是什么文件夹可以删除吗
    AppData是Windows操作系统中的一个隐藏文件夹,用于存储应用程序的数据、设置和临时文件等,包含了三个子文件夹:Roaming、Local和LocalLow。不建议删除AppData文件夹中的内容,因为这些文件对于应用程序的正常运行...
    99+
    2023-08-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作