70

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

4

7 回答 7

97

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

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

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

如果你想用 Python 编写一个可以在多核上运行的并行程序,你有几个不同的选择:

  • 使用该模块编写一个多线程程序threading并在 IronPython 或 Jython 运行时中运行它。
  • 使用该processing模块(现在作为multiprocessing模块包含在 Python 2.6 中)一次在多个进程中运行您的代码。
  • 使用该subprocess模块运行多个 python 解释器并在它们之间进行通信。
  • 使用Twisted安瓿。这不仅具有跨不同进程运行代码的优势,而且(如果您不共享对文件等内容的访问)也可能跨不同计算机运行。

无论您选择其中哪个选项,您都需要了解如何将程序正在执行的工作拆分为有意义的块。由于我不确定您正在考虑编写什么样的程序,因此很难提供有用的示例。

于 2008-10-15T09:24:52.147 回答
24

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

于 2008-10-15T07:26:44.490 回答
5

您实际上可以编写将使用多个处理器的程序。由于 GIL 锁,您无法使用线程执行此操作,但您可以使用不同的进程执行此操作。任何一个:

  • 使用subprocess模块,并划分您的代码以执行每个处理器的进程
  • 看看parallelpython模块
  • 如果您使用 python > 2.6,请查看多进程模块。
于 2008-10-15T09:58:37.243 回答
2

您可以阅读有关 python 中的多线程和一般线程的信息

Python 中的多线程:http: //www.devshed.com/c/a/Python/Basic-Threading-in-Python/

于 2008-10-15T07:03:00.047 回答
2

如果我理解正确的话,Python 有一个叫做 GIL(全局解释器锁)的东西,它有效地使得在 Python 中执行多线程时无法利用多核。

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

于 2008-10-15T07:07:18.290 回答
1

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

Python 2.6 获得了多进程(进程,如程序运行)和更多用于多线程编程的同步和通信对象。

于 2008-10-15T07:08:24.497 回答
0

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

于 2009-02-13T13:22:51.163 回答