Python关于全局解释器锁的提议

简介: 关于全局解释器锁(GIL)是一个提议,旨在解决CPython中最大的可扩展性限制——全局解释器锁(GIL)。GIL阻止了多个线程同时执行Python代码,从而影响了Python利用多核CPU的能力。全局解释器锁提出了添加一个构建配置(--disable-gil),让CPython可以在没有GIL的情况下运行Python代码,并且进行必要的改动,使得解释器线程安全。

444.png

关于全局解释器锁(GIL)是一个提议,旨在解决CPython中最大的可扩展性限制——全局解释器锁(GIL)。GIL阻止了多个线程同时执行Python代码,从而影响了Python利用多核CPU的能力。全局解释器锁提出了添加一个构建配置(--disable-gil),让CPython可以在没有GIL的情况下运行Python代码,并且进行必要的改动,使得解释器线程安全。

全局解释器锁主要针对科学计算领域,特别是AI/ML领域的需求,因为这些领域需要高效地利用并行性来加速计算密集型的任务。GIL使得很多类型的并行性难以在Python中表达或实现,例如操作间、请求间等,并且给现有的并行化技术带来了很多限制(如多进程、协程等)。全局解释器锁收集了一些来自该领域专家和用户的反馈和见证,说明了GIL对他们工作和研究带来的困难和挑战。

全局解释器锁(GIL)涉及到CPython内部实现的大量改动,但对公共Python和C API的影响相对较小。主要改动包括:

  • 引入偏置引用计数(biased reference counting)机制,以减少引用计数操作对原子指令(atomic instruction)和缓存一致性协议(cache coherence protocol)带来的开销。
  • 引入延迟引用计数(deferred reference counting)机制,以避免在对象之间传递所有权时频繁地增加或减少引用计数。
  • 引入不死对象(immortal objects)机制,以避免在某些情况下出现循环引用导致内存泄漏。
  • 修改CPython内部数据结构和函数调用栈等部分,以保证线程安全。

全局解释器锁(GIL)还提出了一些API变化,包括:

  • 添加Py_NOGIL宏,在编译时指示是否使用--disable-gil选项。
  • 添加PyThreadState_GetInterpreter()函数,在运行时获取当前线程所属的解释器对象。
  • 添加PyInterpreterState_GetMainModule()函数,在运行时获取当前解释器所属的主模块对象。
  • 修改PyEval_InitThreads()函数,在没有GIL时不执行任何操作。
  • 修改PyEval_RestoreThread()函数,在没有GIL时不检查当前线程是否持有GIL。

全局解释器锁(GIL)还讨论了一些可能存在或需要考虑的问题和挑战,例如:

  • 性能影响:去除GIL可能会导致单线程性能下降或波动。作者提供了一些基准测试结果,并认为这种影响是可以接受或优化掉的。
  • 兼容性问题:去除GIL可能会导致一些依赖于GIL特性或假设存在GIL情况下编写的扩展模块无法正常工作。作者建议使用--disable-gil选项构建CPython时,在导入这些模块时抛出异常,并鼓励扩展模块作者适配新

目前提议目前还处于草案状态,尚未被接受或拒绝。它引起了Python社区的广泛关注和讨论,有些人对它表示支持和赞赏,有些人则对它表示质疑和担忧。评价这个提议的标准可能因人而异,但一般来说,可以从以下几个方面考虑:

  • 需求性:这个提议是否能够解决一个重要且普遍的问题?是否有足够多的用户和场景需要这个功能?
  • 可行性:这个提议是否能够在技术上实现?是否有足够的资源和时间来完成这个工作?是否有足够的测试和验证来保证质量?
  • 兼容性:这个提议是否会影响现有的代码和模块?是否会引入新的错误或安全风险?是否会导致分裂或混乱?
  • 性能影响:这个提议是否会改善或恶化Python的性能?是否会带来新的优化机会或挑战?
  • 一致性:这个提议是否符合Python的设计哲学和原则?是否与其他语言特性或标准保持一致?
相关文章
|
7月前
|
并行计算 Python
python并发编程: Python速度慢的罪魁祸首,全局解释器锁GIL
python并发编程: Python速度慢的罪魁祸首,全局解释器锁GIL
63 1
python并发编程: Python速度慢的罪魁祸首,全局解释器锁GIL
|
6月前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
66 0
|
4月前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
2月前
|
Java C语言 Python
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
47 0
|
3月前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
35 0
|
4月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
4月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
4月前
|
安全 Python
Python 中的全局解释器锁(GIL)详解
【8月更文挑战第24天】
101 0
|
4月前
|
Python
python 协程 自定义互斥锁
【8月更文挑战第6天】这段代码展示了如何在Python的异步编程中自定义一个互斥锁(`CustomMutex`类)。该类通过`asyncio.Lock`实现,并提供`acquire`和`release`方法来控制锁的获取与释放。示例还包含了使用此自定义锁的场景:两个任务(`task1`和`task2`)尝试按序获取锁执行操作,直观地演示了互斥锁的作用。这有助于理解Python协程中互斥锁的自定义实现及其基本用法。
|
6月前
|
API 项目管理 开发者
PEP是Python改进的关键文档,用于提议新特性和标准化变更
【6月更文挑战第26天】PEP是Python改进的关键文档,用于提议新特性和标准化变更。它们提出功能设计,记录社区决策,建立标准,促进共识,并改进开发流程。PEP是Python不断演进和优化的核心机制,驱动语言的未来发展。**
49 2