当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-26 01:40:12 Python

Python有一个著名的锁——全局解释器锁(GlobalInterpreterLock,简称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使得部署PythonAI模型(例如基于神经网络的AI模型)变得困难)在社区中有很多呼吁和尝试移除GIL,但这个话题一直没有得到解决。抱怨、质疑、不满、不甘、期待等诸多情绪,都不是那么容易平息的。然而,从一个长期存在的庞大项目中移除一个基础设计谈何容易?2023年刚过,这个话题又火了起来,又一轮对GIL的挑战又开始了。这一次,事情似乎有了新的转机,说不定这一次会成功呢?PEP-703于今年1月9日新鲜出炉。虽然还处于“草稿”状态,没有被采纳,但是这个PEP意义重大!(注:每个Python学习者都应该对PEP有一个基本的了解,推荐阅读《学习Python,怎能不懂点PEP呢? 》)这篇PEP的作者是nogil项目的作者SamGross。长期阅读PythonCat的读者应该有这样的印象,我们翻译了他在2021年与Python核心开发者的研讨会纪要。这篇总结总结了nogil的主要设计思想,同时回答了核心最重要的问题开发商。关注问题约20个。经过一年多的沉淀,nogil项目终于形成了正式的PEP,这意味着它更有可能被采纳到Python主分支!PEP的标题是《使 CPython 的 GIL 成为可选项》(MakingtheGlobalInterpreterLockOptionalinCPython),内容详实,一万多字。这种规模的政治人物,在所有政治人物中绝对排在前十。简而言之,本提案建议在CPython中添加一个构建时配置项--disable-gil,用于构建一个线程安全的GIL-free解释器。为了实现一个GIL-free解释器,Python的部分底层设计必须改变,可以归纳为四类:引用计数、内存管理、容器线程安全锁、原子API。被忽略的问题:Python会发布两个不同版本的解释器,第三方库会相应开发/维护/发布两个版本的包。PEP-703的作者也考虑了这个问题。他提出的解决方案是与Anaconda一起发布无GIL的Python,同时在conda中集中发布和管理兼容新Python的库。考虑到Anaconda在科学计算和数值计算领域的强大影响力,此举不仅可以更好地发挥nogilPython的用处,还可以减少用户和第三方库开发者在面对两个发行版时的割裂感。值得注意的是,nogil的Python有一个更大的问题,就是会影响单线程程序的性能。基于Python3.11版本,实现偏向引用计数和永生对象后,Python单线程性能会降低10%。虽然这个值在最新的nogil原型版本上可以降低到5%,但至少还有两个其他不可避免的性能下降点:2%-全局空闲列表(主要是元组和浮点数的空闲列表)1.5%-每个互斥量集合中的对象(字典、列表、队列)单线程代码是使用最广泛的场景,可以说这会影响到每一个Python用户。任何试图移除GIL的项目都将不可避免地面临这一挑战。尽管存在以上两大问题,PEP-703还是有可取之处的。例如,相比于2015年提出的著名的Gilectomy项目(由GILsurgery这两个词组合而成,surgery是一个医学术语“切除术”),nogil在单线程性能上要快很多,同时可扩展性也更好.例如,相比于2021年大热的“香农计划”作者EricSnow提出的PEP-684方案(为每个子解释器创建一个GIL),后者需要以实现多个PEP为前提(如PEP-554,PEP-683),另一方面,用户需要处理多个子解释器之间共享变量的麻烦。在Shannon项目的《Python 3.12 目标》中,PEP-554和PEP-684已经被包含进来。该版本的目标是充分利用Python的子解释器,让子解释器使用各自的GIL来实现多线程并行。好消息是3.12计划与本文的主角PEP-703并不冲突。其实他们的很多设计细节都是一样的,也就是说这两套GIL修改方案是可以并存的,互相促进,事半功倍!Shannon计划有Python之父GuidovanRossum的平台,财大气粗的微软支持豪华的开发团队(包括Guido和EricSnow)。因此,多解释器和多GIL的解决方案很可能会更快落地。并且PEP-703得到了PSF首位全职开发者?ukaszLanga的全力支持,社区反响也不错。我觉得它未来落地的希望很大!无论如何,香农计划和PEP-703对GIL的挑战比以往所有的尝试都更加猛烈,也更有可能成功。太远了。最后,感谢大家的阅读,如果您喜欢本文,请务必点赞/分享和支持~