多处理器编程和多核编程有什么区别?
最好能在Python中展示如何编写小型的多处理器编程和多核编程程序的示例。
“多处理器”或“多核心”编程并不存在。在应用程序员看来,“多处理器”和“多核心”计算机的区别可能与你无关; 它涉及核心如何共享访问内存的微妙之处。
为了利用多核(或多处理器)计算机,需要编写能够以并行方式运行的程序,并使用运行时使程序实际上可以在多个核心上并行执行(以及操作系统,尽管任何可以在 PC 上运行的操作系统都可以这样做)。这真正是并行编程,尽管有不同的并行编程方法。对于Python相关的是多进程和多线程。
在像 C、C++、Java 和 C# 这样的语言中,可以通过执行多个线程编写并行程序。CPython 和 PyPy 运行时中的全局解释器锁排除了此选项;但仅适用于这些运行时。(我的个人意见是,多线程是危险而棘手的,Python鼓励您不要考虑它作为获取性能优势的一种方式,这通常是件好事。)
如果想在 Python 中编写可以在多个核心上运行的并行程序,则有几种不同的选项:
threading
模块编写多线程程序,并在 IronPython 或 Jython 运行时中运行它。processing
模块(现在包括在 Python 2.6 中的multiprocessing
模块)一次性在多个进程中运行代码。subprocess
模块运行多个Python解释器并在它们之间通信。无论选择哪种方法,您都需要了解如何将程序正在执行的任务分解成有意义的小块进行分离。由于我不确定您打算编写什么样的程序,因此很难提供一个有用的示例。
正如在另一篇文章中提到的那样,Python 2.6拥有multiprocessing模块,它可以利用多个核心/处理器(通过透明地启动多个进程来绕过GIL)。 它提供了与线程模块类似的某些原语。 在文档页面中会找到一些(简单)使用示例。
如果我理解正确,Python 有一个称为 GIL(全局解释器锁)的东西,它在使用多个线程时有效地使利用多核变得不可能。
参见 Guido van Rossum 的博客文章。据我所知,在“主流”语言中,只有 C/C++ 和 Java 有效支持多核。
主要的区别在于如何组织和分配数据。多核通常在CPU的不同核之间具有更高的带宽,而多处理器需要更多地涉及CPU之间的总线。
Python 2.6已经拥有了多进程(进程即运行的程序)以及更多用于多线程编程的同步和通信对象。
如果你没有Python 2.6(例如,如果你使用Ubuntu Edgy或Intrepid),你可以使用Google code backported 版本的multiprocessing。它是PyPI的一部分,这意味着你可以使用EasyInstall(在Ubuntu中是python-setuptools软件包的一部分)轻松安装它。