首页 首页 大数据 大数据入门 查看内容

多核Python: 个艰难却有价值的目标

木马童年 2019-2-28 11:35 69 0

现在的Python有这么多方便优秀的特性,可是有 个特性 直迟迟没有实现:所有基于CPython的解释器都不能同时在多个CPU核心上并行运行啊app。 这 直是Python较大的绊脚石,特别是现有的实现方法都非常笨拙。目前,随着 ...

现在的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目前没有任何反应,期待等待的时间不会太长。

原文链接:http://www.infoworld.com/article/3079037/open-source-tools/multicore-python-a-tough-worthy-and-reachable-goal.html

在不久的将来,多智时代一定会彻底走入我们的生活,有兴趣入行未来前沿产业的朋友,可以收藏多智时代,及时获取人工智能、大数据、云计算和物联网的前沿资讯和基础知识,让我们一起携手,引领人工智能的未来!

英特尔 解决方案 程序员 科学计算 创始人
0
为您推荐
什么样的人才是大数据人才呢?我们应该怎么定义和分类?

什么样的人才是大数据人才呢?我们应该怎么定义和分类

在未来世界,国家之间、区域之间甚至是公司之间的大数据人才的争夺战,将是愈演愈烈的…...

数据科学,数据分析和机器学习之间,有什么本质区别?

数据科学,数据分析和机器学习之间,有什么本质区别?

我们都知道机器学习,数据科学和数据分析是未来的发展方向。有些公司不仅利用大数据帮…...

大数据技术怎么学习,在学习大数据之前,需要具备什么基础?

大数据技术怎么学习,在学习大数据之前,需要具备什么

  大数据又称黑暗数据,是指人脑无法处理的海量数据聚合成的信息资产,在民生、IT、…...

大数据现在处于什么阶段,入行大数据,需要学习哪些基础知识?

大数据现在处于什么阶段,入行大数据,需要学习哪些基

大数据的发展历程总体上可以划分为三个重要阶段,萌芽期、成熟期和大规模应用期…...

对于大数据开发的学习,最经典的学习路线是什么?

对于大数据开发的学习,最经典的学习路线是什么?

对于现代社会,大数据开发的重要性不言而喻,通过大量的数据处理、分析获取有价值的信…...

大数据时代,主要需要什么类型的人才?

大数据时代,主要需要什么类型的人才?

什么是大数据,大数据是主要指的是,无法在可承受的时间范围内用常规软件工具进行捕捉…...