热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于python:Python-新提案废除全局解释器锁-GIL-CPython-解释器或许会变得更快

近日,开发者AlexWaygood在Python基金会博客中提到了上周刚刚举办的Python语言峰会上对于Python语言的重大议题——“破除”Python语言的全局解释器锁

近日,开发者 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 官网尚未就施行作出最终决定,但所有仍旧值得期待。


推荐阅读
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文介绍如何通过 Python 的 `unittest` 和 `functools` 模块封装一个依赖方法,用于管理测试用例之间的依赖关系。该方法能够确保在某个测试用例失败时,依赖于它的其他测试用例将被跳过。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 2018年在北航听陈博士讲解时,对重入漏洞有了初步了解。最近重温了慢雾科技的相关文章,发现他们对重入漏洞的解释非常清晰明了。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
author-avatar
红星闪闪爱哭的鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有