资料介绍
现在的Python有这么多方便优秀的特性,可是有一个特性一直迟迟没有实现:所有基于CPython的解释器都不能同时在多个CPU核心上并行运行啊app。
这一直是Python最大的绊脚石,特别是现有的实现方法都非常笨拙。目前,随着现在处理器的核心数目不断增长(英特尔最近发布了24核心的CPU),寻求一个长远的解决方案变得更加急不可待。
共用一个锁
事实上,在Python中使用多线程是完全可以的——其实用的很多。但是对于CPython来说,不可能的事情是,在多个不同的CPU核心上并行运行不同的线程。在CPython的内存管理中存在安全隐患,所以解释器每次只能运行一个线程,然后根据需要控制锁的全局状态,在不同的线程中切换。
这种锁的机制——解释器全局锁(the Global Interpreter Lock,GIL)是CPython不支持并行线程的根本原因。但是也有一些缓冲的中间件,比如,在硬盘上的IOS操作和网络读取不和GIL绑定,所以可以自由地并行运行他们的线程,但是和CPU绑定的线程就成问题了。
对于Python程序员来说,这就意味着在大型计算任务方面的并行性能的损失。使用Python工作的方便伴随着多线程性能方面的巨大损失,这时,同样比较方便的其他语言就占了优势,比如Google的Go语言。
打破一个锁
随着时间的推移,人们相出了很多策略来优化多线程——但大多都是治标不治本——都没有从根本上解决GIL的问题。一个标准的方案是,启动多个CPython实例,然后在这些实例之间共享状态和数据;每一个实例都独立地运行在不同的CPU上。但是Jeff Knupp说,这种方案带来的收益会因为共享状态的成本大大损失。
C语言扩展并不受GIL的限制,所以很多对速度要求很高的库(比如科学计算库Numpy)是用C实现的,可以多核多线程运行。但是CPython的限制依然存在,如果说避免这个问题最好的方法是使用C扩展的话,那么只会让更多的程序员放弃Python而使用C语言。
PyPy,Python的自举实现,采用了JIT威廉希尔官方网站 ,虽然没有解决GIL的问题,但是大大提升了代码运行的速度。从某种方面讲,如果只看速度的话,也差不到哪里去,但是从根本上讲,并没有解决多线程的问题。
最后,GIL在Python 3中得到了优化,有了更好的线程切换。但是根本问题依然存在——由于GIL程序还是不能真正地多线程并行运行。
没有GIL?没有问题
抛开上面这些问题不说,对没有GIL的、兼容现有app的Python的追求从未停止。很多Python的其他实现都完全原离GIL,但是都遭到了性能上的损失。比如,一个运行在JVM之上的Python实现——Jython,使用了JVM的对象跟踪系统,而不是GIL。IronPython采用了和微软的CLR相同的策略。但是两者的性能都很反常。有时候,它们表现的比CPython还慢,有时候不兼容外部的C代码,所以很多程序并不能正常工作。
Trent Nelson of Continuum Analytics的一个叫PyParallel的项目,是一个“实验性的,理论证明可行的对多核心CPU并行运算优化的Python 3设计实现。”它并没有废弃GIL,但是通过替换async优化了它的引入,所以应用可以使用async来并行运算(就像IO、网络服务器一样)。这个项目已经停滞好几个月了,但是从文档来看,它的开发者对这样的进度很满意。最终,他们在CPython中这样宣布:“慢点没什么,只要方向对了就可以。”
PyPy的创始人有一个长期的项目,这个Python的实现使用了一种叫“软件内存交换(software transactional memory)”(PyPy-STM)的威廉希尔官方网站 。根据PyPy创始人的说法,好处是,“这个项目可以对现有的程序优化,使没有多线程运行的程序可以在多个核心上运行。”
PyPy-STM听起来像魔法一样,但是它有两个缺点。第一,现在这个项目还在开发中,目前只支持2.X。第二,对于单线程的程序,性能有所下降。根据Python的创始人范·罗苏姆规定的条款,任何有关解决GIL的尝试,都不能降低单线程程序运行的速度。所以,这个项目暂时不能被CPython接受。
进步与等待
Python的核心开发者Larry Hastings在PyCon 2016上分享了一些关于解决GIL问题的观点,Hastings分享了他关于GIL问题的尝试,并在最后给出了一个没有GIL的Python实现,但是因为缓存问题,性能也不尽人意。
Hastings在最后总结到,你可以删掉GIL,但是你必须有一种方法来确保每次只有一个线程在操作全局对象——比如,使用一个公有线程,让解释器来处理状态的改变。
一个好消息是,如果CPython修复了GI了的问题,那么开发者使用Python可以轻松地开发多线程程序。因为Python的语法在不断优化,Python 3.5以来,async/await语法使得开发多线程程序非常简单。
现在,关于Python GIL的问题还有很多工作需要做。但是毫无疑问的是,问题的第一个答案将是像PyPy-STM一样的单独的Python实现。现在如果想尝试一下没有GIL的Python,可以试一下第三方的版本。CPython目前没有任何反应,期待等待的时间不会太长。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 利用Python编写简单网络爬虫实例 14次下载
- 谁说Python/Linux不能接受中断
- 《Python编程入门》.pdf 0次下载
- 如何利用DHCP中继代理解决不同网段IP自动分配 0次下载
- 机器学习必学的Python代码示例集 14次下载
- Python的入门基础知识汇总 14次下载
- python使用的一些基本知识详细介绍 13次下载
- Python的基本知识和特点及功能详细说明 13次下载
- 51单片机的可重入函数有什么陷阱
- python基础教程之如何使用python进行环境搭建 32次下载
- 利用Python进行中超联赛,赛事和赛程查询的APP设计代码免费下载 5次下载
- 《Python开发威廉希尔官方网站 详解》-随书附带程序 0次下载
- 《Raspberry Pi Python 编程入门 》-电子书籍.pdf 0次下载
- 多核编程指南 3次下载
- 多核处理器如何给医疗成像带来创新 10次下载
- 利用Python脚本登录到交换机并创建VLAN 248次阅读
- 什么是多核多线程?多核多线程如何提高程序的运行效率? 1035次阅读
- 多核同构SMP--调度算法分析 1960次阅读
- 关于Python 加速工具的选单 307次阅读
- 用Flet+Python写个美观的登录程序 4852次阅读
- Python怎么玩转JS脚本 914次阅读
- 利用Python生成module instance 1162次阅读
- PLC梯形图的设计与编程方法 3346次阅读
- Python的处理速度怎样做可以加快 661次阅读
- 变频器不能配漏电保护器的原因是什么 1.5w次阅读
- python适合做什么开发_python未来发展怎么样 8251次阅读
- 如何快速学会Python?利用Python进行数据分析 1w次阅读
- 基于python的小波阈值去噪算法 9930次阅读
- 变频器不能配漏电保护器原理和案例以及解决方法 1.2w次阅读
- 布线设计时,怎么解决不同电压域的问题? 6975次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1490次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 92次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 10次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7蓝牙设备在嵌入式领域的广泛应用
- 0.63 MB | 3次下载 | 免费
- 89天练会电子电路识图
- 5.91 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多