电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>C语言|源代码>Python怎样解决不能利用多核的问题

Python怎样解决不能利用多核的问题

2017-10-10 | rar | 0.06 MB | 次下载 | 1积分

资料介绍


  现在的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目前没有任何反应,期待等待的时间不会太长。
 
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1电子电路原理第七版PDF电子教材免费下载
  2. 0.00 MB  |  1490次下载  |  免费
  3. 2单片机典型实例介绍
  4. 18.19 MB  |  92次下载  |  1 积分
  5. 3S7-200PLC编程实例详细资料
  6. 1.17 MB  |  27次下载  |  1 积分
  7. 4笔记本电脑主板的元件识别和讲解说明
  8. 4.28 MB  |  18次下载  |  4 积分
  9. 5开关电源原理及各功能电路详解
  10. 0.38 MB  |  10次下载  |  免费
  11. 6基于AT89C2051/4051单片机编程器的实验
  12. 0.11 MB  |  4次下载  |  免费
  13. 7蓝牙设备在嵌入式领域的广泛应用
  14. 0.63 MB  |  3次下载  |  免费
  15. 89天练会电子电路识图
  16. 5.91 MB  |  3次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234313次下载  |  免费
  3. 2PADS 9.0 2009最新版 -下载
  4. 0.00 MB  |  66304次下载  |  免费
  5. 3protel99下载protel99软件下载(中文版)
  6. 0.00 MB  |  51209次下载  |  免费
  7. 4LabView 8.0 专业版下载 (3CD完整版)
  8. 0.00 MB  |  51043次下载  |  免费
  9. 5555集成电路应用800例(新编版)
  10. 0.00 MB  |  33562次下载  |  免费
  11. 6接口电路图大全
  12. 未知  |  30320次下载  |  免费
  13. 7Multisim 10下载Multisim 10 中文版
  14. 0.00 MB  |  28588次下载  |  免费
  15. 8开关电源设计实例指南
  16. 未知  |  21539次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935053次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537791次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234313次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233045次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191183次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183277次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138039次下载  |  免费