python是否支持多处理器/多核编程?


69

多处理器编程和多核编程之间有什么区别?最好在python中显示示例如何编写用于多程序和多核编程的小程序

Answers:


96

没有“多处理器”或“多核”编程之类的东西。作为应用程序程序员,“多处理器”计算机和“多核”计算机之间的区别可能与您无关。它与内核如何共享对内存的访问的微妙之处有关。

为了利用多核(或多处理器)计算机,您需要以一种可以并行运行的方式编写程序,并需要一个运行时,该程序才能在多个核上实际并行执行(并且操作系统,尽管您可以在PC上运行的任何操作系统都可以执行此操作)。这实在是并行编程,虽然有不同的方法来并行编程。与Python相关的是多处理和多线程。

在C,C ++,Java和C#等语言中,您可以通过执行多个线程来编写并行程序。CPython和PyPy运行时中的全局解释器锁定排除了此选项;但仅适用于那些运行时。(我个人认为,多线程是危险且棘手的,Python鼓励您不要将其视为获得性能优势的一种方式,这通常是一件好事。)

如果要编写一个可以在Python的多个内核上运行的并行程序,则有几种不同的选择:

  • 使用该threading模块编写一个多线程程序,然后在IronPython或Jython运行时中运行它。
  • 使用该processing模块(现已包含在Python 2.6中作为multiprocessing模块)可一次在多个进程中运行您的代码。
  • 使用该subprocess模块运行多个python解释器并在它们之间进行通信。
  • 使用扭曲安瓿瓶。这样做的好处是,不仅可以跨不同的进程运行代码,而且(如果不共享对文件之类的访问权限)也可以跨不同的计算机运行。

无论选择这些选项中的哪一个,都将需要了解如何将程序正在完成的工作分成有意义的块以进行分离。由于我不确定您打算编写哪种程序,因此很难提供有用的示例。


3
没有“多处理器”或“多核”编程之类的东西-确实有。多核编程正在编写利用多核的应用程序。
johndodo 2012年

1
与利用多个处理器的应用程序相反?
雕文2012年

8
这些是多处理器应用程序...不确定我是否理解了这一点。我想这样说:大多数人都理解“多核编程”和“多处理器编程”的含义。因此,OP的问题可以翻译为“是否可以在python中编写在多个内核/处理器上运行的程序?” 您说的这些术语无效-是的。这就是我要添加的全部内容。
johndodo 2012年

2
抱歉,我不同意您的观点。很好地使用线程确实需要一些思考和适当的设计,但是我们应该是知道如何思考和解决问题的程序员。是的,可能会严重使用它们,但是几乎我们所做的所有事情都一样。为什么仅仅因为需要使用就忽略工具?多个过程是不一样的。如果要使用无法腌制的对象,则设置/拆卸的开销,浪费的内存,通信开销和好运。哦,是的,只是围绕限制重新设计您的应用
基本

6
这并不是说线程需要使用; 当然,所有编程都需要思考。线程的问题在于,它们需要不断地意识到每行代码中它们的存在。相反,如果您正在使用消息传递进行编程,则可以忘记所有有关外部系统的信息,直到您的功能完成并且该时间接收下一条消息为止。共享可变状态多线程编程给程序员带来了持续的,残酷的焦虑,或者为用户带来了无法再现的持续流。
雕文

24

如另一篇文章中所述,Python 2.6具有多处理模块,该模块可以利用多个内核/处理器(它通过透明地启动多个进程来绕过GIL)。它提供了一些类似于线程模块的原语。您会在文档页面中找到一些(简单的)用法示例。


由于进程不共享它们的地址空间,因此,这种答案令人惊讶,这导致了编程模型的根本不同。
Alex Kreimer 2014年


5

您实际上可以编写将使用多个处理器的程序。由于GIL锁,您无法使用线程来执行此操作,但是可以使用其他进程来执行。要么:

  • 使用子流程模块,并划分代码以每个处理器执行一个流程
  • 看看parallelpython模块
  • 如果您使用python> 2.6,请查看多进程模块。

1
线程和python将在多个内核上拆分,但是其中一些内核(除非您使用C做一些魔术,否则所有内核)都将在等待GIL。这就是为什么在Python 3.2之前,与CPU绑定的线程在单核上的性能要优于多核计算机。
乍得

1
一些模块是用C实现的,并将发布GIL。zlib模块(也由gzip模块使用)是其中之一。您可以使用多个内核在python中使用多个线程解压缩或压缩数据。标准库(正则表达式库)和其他一些第三方库(例如net-snmp等)中也存在其他示例。
Will Pierce

@WillPierce的内容是“可以做到,而且很好,但前提是您不使用Python”。我可以编写几乎可以在任何语言中使用的C模块。对于C语言来说这是一个加号,但仅凸显了Python的缺点。
2014年


2

如果我对事情的理解正确,Python就有一个叫做GIL(全局解释器锁)的东西,当在Python中执行多个线程时,它实际上无法利用多核。

参见Guido van Rossum关于该主题的博客条目。据我所知,在“主流”语言中,只有C / C ++和Java有效地支持多核。


1
全局解释器锁也是CPython的问题-Jython和IronPython分别使用其运行时的线程系统。
VolkA

但是,Jython比CPython慢​​。IronPython一样快。
Blaisorblade 2011年

@ 1800INFORMATION不行!只有Windows用户/开发人员使用它MUCH,但C / C ++和Java则不是。期间
所有的首字母缩写为Vаиітy16年

@Marty好吧,我当时不知道你所说的主流是什么意思,但是它很受欢迎
1800信息

1

主要区别在于您如何组织和分发数据。多核通常在CPU的不同核之间具有更高的带宽,并且多处理器需要更多地占用CPU之间的总线。

Python 2.6具有多进程(进程,如程序运行时一样)和更多用于多线程编程的同步和通信对象。


0

如果您没有Python 2.6(例如,在使用Ubuntu Edgy或Intrepid时则没有),则可以使用Google代码反向移植的多处理版本。它是PyPI的一部分,这意味着您可以使用EasyInstall轻松安装它(这是Ubuntu中python-setuptools软件包的一部分)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.