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

Posted

技术标签:

【中文标题】python是不是支持多处理器/多核编程?【英文标题】:Does python support multiprocessor/multicore programming?python是否支持多处理器/多核编程? 【发布时间】:2010-09-17 06:19:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

没有“多处理器”或“多核”编程之类的东西——当然有。 多核编程正在编写利用多核优势的应用程序。 与利用多个处理器的应用程序相反? 那些是多处理器应用程序...不确定我是否明白这一点。我想说的是:大多数人都理解术语“多核编程”和“多处理器编程”的含义。因此,OP 的问题可以翻译为“是否可以编写在 python 中的多个内核/处理器上运行的程序?”你说的条款是无效的——嗯,他们是。这就是我想补充的全部内容。 对不起,但我不同意你的线程意见。使用好线程确实需要一点思考和适当的设计,但我们应该是知道如何思考和解决问题的程序员。是的,它们可能会被糟糕地使用,但这同样适用于我们所做的几乎所有事情。为什么仅仅因为它需要考虑使用而忽略一个工具?多个过程是不一样的。如果您想使用无法腌制的对象,则设置/拆卸会产生开销,浪费内存,通信开销以及祝您好运。哦,对了,只需围绕限制重新设计您的应用程序 并不是线程需要思想才能使用;当然,所有编程都需要思考。线程的问题在于它们需要在每一行代码中始终意识到它们的存在。相比之下,如果您正在使用消息传递进行编程,您可能会忘记所有外部系统,直到您的函数完成并且是时候接收下一条消息了。共享可变状态多线程编程会给程序员带来持续的、严重的焦虑,或者给用户带来源源不断的无法重现。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

线程和 python 将被拆分在多个核心上,但其中一些核心(除了一个,除非你在 C 中做一些魔法)只会等待 GIL。这就是为什么在 Python 3.2 之前,CPU 密集型线程在单核机器上的性能优于多核机器。 一些模块是用 C 实现的,将发布 GIL。 zlib 模块(也被 gzip 模块使用)就是其中之一。您可以使用多个内核在 python 中使用多个线程来解压缩或压缩数据。其他示例存在于标准库(re 正则表达式库)和其他一些第三方库中,例如 net-snmp 等。 @WillPierce 这读起来就像“可以做到,而且非常好,但前提是你不使用 Python”。我可以编写一个几乎可以在任何语言中使用的 C 模块。这对 C 来说是一个优点,但只是突出了 Python 的缺点。【参考方案4】:

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

【讨论】:

这类答案令人惊讶,因为进程不共享它们的地址空间,这导致了完全不同的编程模型。 这里有一个小而清晰的方法pythonprogramming.net/threading-tutorial-python【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

请参阅 Guido van Rossum 的 blog entry 关于该主题的内容。据我所知,在“主流”语言中,只有 C/C++ 和 Java 对多核有有效的支持。

【讨论】:

全局解释器锁也只是一个 CPython 问题 - Jython 和 IronPython 分别使用它们运行时的线程系统。 但是,Jython 比 CPython 慢。 IronPython 也一样快。 @1800INFORMATION 不是!只有 Windows 用户/开发人员使用它很多,但它不是 C/C++ 和 Java 的情况。期间 @Marty 好吧我不知道你说的主流是什么意思,但它很受欢迎【参考方案7】:

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

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

【讨论】:

以上是关于python是不是支持多处理器/多核编程?的主要内容,如果未能解决你的问题,请参考以下文章

多核编程与CPU亲和力

并发编程之多进程操作

python并发编程基础

iOS开发——多线程编程(GCD)

网络分流器-网络分流器-多核编程的几个难题及其应对策略

Python并发编程—进程