很遗憾,并不是。因为 Python 说冥器的设计,应用多线程以进步机能可以算是一个艰苦的义务。在最坏的情况下,多线程反而会降低(有时很明显)法度榜样的运行速度。一个计算机科学专业的新生就可以告诉你:当多个线程竞争一个共享资本时将会产生什么。结不雅平日不睬想。很多情况下多线程都能很好地工作,对于说冥器的实现和内核开辟人员来说,不要对 Python 多线程机能有太多抱怨可能是他们最大年夜的心愿。
如今该怎么办呢?慌了吗?
那么为什愦我们不摈弃 GIL 呢?很多人也许不知道,1999年的时刻,Greg Stein 针对 Python 1.5 提交了一个名为“free threading”的补丁,这个补丁经常被提到却不怎么被人懂得。这个补丁就测验测验了将 GIL 完全移除,并用细粒度的锁来代替。然而,GIL 移除的价值是单线程法度榜样的履行速度降低,降低的幅度大年夜概有 40%。应用两个线程可以让速度有所晋升,然则速度的晋升并没有跟着核数的增长而线性增长。因为履行速度的降低,这一补丁没有被接收了,并且几乎被人遗忘。
GIL 让人头痛,我们照样想点其他办法吧
尽管“free threading”这个补丁没有被接收,然则它照样有启发性意义。它证清楚明了一个关于 Python 说冥器的根本要点:移除 GIL 是异常艰苦的。比起该补丁宣布的时刻,如今的说冥器依附的全局状况变得更多了,这使得移除 GIL 变得加倍艰苦。值得一提的是,也恰是因为这个原因,很多人对移除 GIL 变得更感兴趣了。艰苦的问题平日都很有趣。
然则这可能有点被误导了。我们假设一下:如不雅我们有如许一个神奇的补丁,它其移除了 GIL ,并且没有使单线程的 Python 代码机能降低,我们会获得一向想要的器械:一个能并发应用所有处理器的线程 API。如今我们已经获得了我们欲望的,但这确切是件功德吗?
基于线程的编程是艰苦的。当一小我认为本身懂得关于线程的一切,总会有一些新问题出现。一些异常有名的说话设计者和研究者站出来否决线程模型,因为在这方面想要获得合理的一致性真的是太难了。就像任何一个写过多线程应用法度榜样的人可以告诉你的一样,不管是多线程应用的开辟照样调试难度都邑是单线程的应用的指数倍。法度榜样员的思维模型往往适应次序履行模型,恰好与并行履行模型不匹配。GIL 的出现无意中赞助了开辟者免于陷仁攀困境。在应用多线程时仍然须要同步原语,GIL 事实上赞助我们包管不合线程之间的数据一致性。
这么说起来 Python 最难的问题似乎有点问错了问题。Python 专家推荐应用多过程代替多线程是有事理的,而不是想要给 Python 线程实现遮羞。Python 的┞封种实现方法促使开辟者应用更安然也更直不雅的方法实现并发模型,同时保存应用多线程进行开辟,闪开辟者在须要的时刻应用。大年夜多半人可能并不清跋扈什么是最好的并行编程模型。然则大年夜多半人都清跋扈多线程的方法并不是最好的并行模型。
不要认为 GIL 是一成不变或者毫无事理的。Antoine Pitrou 在 Python 3.2 中实现了一个新的 GIL ,比脚绫趋显地改进的 Python 说冥器。这是1992年以来,针对 GIL 最重要的一次改进。这个改变异常巨大年夜,很难在这里解释清跋扈,然则大年夜高层次来看,旧的 GIL 经由过程对 Python 指令进行计数来肯定何时释放 GIL。因为 Python 指令和翻译成的机械指令并非一一对应的关系,这使得单条 Python 指令可能包含大年夜量工作。新的 GIL 用一个固定的超不时光来指导当前的线忱矸⑴锁。在当前哨程持有锁且第二个线程请求这个锁的时刻,当前哨程就会在 5 ms 后被强迫释放这个锁(这就是说,当前哨程每 5 ms 就要检查其是否须要释放这个锁)。在义务可以履行的情况下,这使得猜测线程间的切换变得更轻易。
然而,这并不是一个完美的改进。对于不合类型义务履行过程中 GIL 的感化的研究,David Beazley 可能是最活泼的一个。除了对 Python 3.2 之前的 GIL 研究最深刻,他还研究了这个最新的 GIL 实现,并且发清楚明了很多有趣的法度榜样筹划:在这些筹划中,即使是新的 GIL 实现,表示也相当糟糕。他今朝仍然经由过程实践研究来推动着有关 GIL 的评论辩论,并宣布实践结不雅。
不管人们对 Python 的 GIL 看法若何,它仍然是 Python 说话里最艰苦的技巧挑衅。想要懂得它的实现须要对操作体系设计、多线程编程、C 说话、说冥器设计和 CPython 说冥器的实现有着异常透辟的懂得。单是这些前塘蕉肆碍了很多开辟者去更彻底地研究 GIL。然而并没有任何迹象注解 GIL 会在不久之后远离我们。今朝,它将持续给那些新房触 Python 并对解决技巧难题感兴趣的人带来困惑和竟椴ⅲ
以上内容是基于我今朝对 Python 说冥器的研究。我枷⒚鸫一些关于说冥器其它方面的内容,然则没有比 GIL 有名度更高的了。固然这些技巧细节来自我对 CPython 代码库的彻底研究,然则如有可能存在不精确的处所。如不雅你发清楚明了不精确的内容,请及时告诉我,我会尽快修改。
【编辑推荐】
- 法度榜样员老司机都要错的Python陷阱与缺点列表
- 大年夜变量到封装:一文带你为机械进修打下坚实的Python基本
- 3行Python代码完成人脸辨认
- Python老司机也会翻车!10个最轻易犯的Python开辟缺点
- 2017 年 Python 应用情况申报,你用 2.x 照样 3.x?
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 一、一些概念 浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存。 深Copy:内存的复>>>详细阅读
本文标题:最令人头疼的Python问题
地址:http://www.17bianji.com/lsqh/38077.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示