2

我对多处理有些困惑。我是一名 3 年的 Python 程序员,但从未真正需要并行执行任务(不仅仅是异步)。但是我知道,或者想知道的是,当multiprocessing在 Python 中使用模块来实现“真正的并行性”时,python.exe会产生新的进程!

例如,像Cinema 4D这样的 3D 软件使用所有可用 CPU 的能力来渲染 3D 场景。但是我Cinema 4D.exe在任务管理器中看不到多个进程。

  1. 我对上面的陈述是否正确,即在使用multiprocessing模块时会产生多个 Python 进程?
  2. 如果是这样,为什么会这样,C++ 应用程序如何在没有多个进程的情况下使用所有 CPU?
4

3 回答 3

6

也可以通过在同一进程中运行多个线程来使用多个 CPU。这不是 Pythonmultiprocessing模块所做的。

Python中有一个threading模块。不幸的是,在 CPython 中,线程并没有你想象的那么有用,因为它们都在争夺所谓的“全局解释器锁”。因此,它们在 Python 中的并行性比在许多其他语言中要少得多。如果您使用线程,您需要担心代码中的哪些操作真正是并行的。如果您使用您不使用的流程(尽管您可能会担心其他事情,例如共享数据)。

我不知道 Python 的替代实现是否与 GIL 有相同的问题。但是除非您专门为 Jython/IronPython/其他东西编写代码,否则 CPython 的限制适用于您的程序......

于 2013-02-08T17:02:00.517 回答
1

我对上面的陈述是否正确,即在使用多处理模块时会产生多个 Python 进程?

对,那是正确的。Python 需要产生新的进程(运行额外的解释器)来并行运行。这是因为 GIL( GlobalInterpreterLock ) 每个解释器只允许一个执行线程。

如果是这样,为什么会这样,C++ 应用程序如何在没有多个进程的情况下使用所有 CPU?

好吧,大概在 Cinema4D 中没有像 GIL 这样的东西——因此它可以并行执行多个线程。

于 2013-02-08T17:00:37.650 回答
1

通常,您会运行多个线程,而不是多个进程。运行线程而不是进程有很多优点。主要优点是属于进程的所有内存都在线程之间共享,您必须设置某种内存共享协议来在不同进程之间共享(部分)数据。

Python 和 C++ 都支持多线程,但正如其他地方所提到的,python 代码不能在多个处理器上运行。然而,它对于在“半并行”中执行操作很有用(我使用 python 线程读取文件并在声卡上播放它,同时记录和保存另一个文件,同时在串行端口来控制“被测”设备)。

Python 模块multiprocessing确实用于使用多个单独的进程,这有助于“打破 Python 解释器锁定”。

一般来说,如果您希望代码完全独立于系统中运行的其他任务,并且不必在进程之间共享 [太多] 数据 - 例如计算非常大的素数,则在单独的进程中运行会更有用在一个独立的进程中做这件事会是一件好事[我的意思是那些有几十万或更多数字的进程] - 该进程在几个小时和几个小时内没有其他输入的情况下自行运行,并且只需要少量不变的输入——“质数候选”。

于 2013-02-08T17:02:11.800 回答