多进程和子进程有啥区别?

Posted

技术标签:

【中文标题】多进程和子进程有啥区别?【英文标题】:What is the difference between multiprocessing and subprocess?多进程和子进程有什么区别? 【发布时间】:2012-11-16 09:50:30 【问题描述】:

我的工作应该使用并行技术,我是 python 的新用户。所以我想知道你是否可以分享一些关于 python multiprocessingsubprocess 模块的材料。这两者有什么区别?

【问题讨论】:

@MartijnPieters 是的,我对这两个相似的模块感到困惑 也可以看看greenlets - 但在你理解给你的OP的答案之前避免那些 deciding among subprocess, multiprocessing, and thread in Python?的可能重复 【参考方案1】:

subprocess 模块可让您运行和控制其他程序。任何可以从计算机上的命令行开始的东西,都可以通过这个模块运行和控制。使用它来将外部程序集成到您的 Python 代码中。

multiprocessing 模块允许您将用 python 编写的任务划分到多个进程中,以帮助提高性能。它提供了一个与threading 模块非常相似的API;它提供了在它创建的进程之间共享数据的方法,并使管理多个进程以运行 Python 代码的任务(更)容易。换句话说,multiprocessing 让您可以利用多个进程通过并行执行代码来更快地完成任务。

【讨论】:

@glglgl:很抱歉我给你带来了痛苦。谢谢你清理它。 :-) 让我们看看我是否可以控制我的撇号! 子进程模块让您可以运行和控制其他程序。”,当然,但它是使用线程还是进程来运行它们?这就是有趣的细节。好像是使用线程异步创建新进程,线程继续与进程通信。 @mins:新进程作为当前进程的分支运行,然后通过execvexecve 系统调用被子进程替换。不涉及线程,它们也不会帮助更快地创建新进程。通信主要由管道(因此,操作系统)处理。如果你想使用线程,你可以,或者你可以使用 asyncio。您的选择。 谢谢,我猜 fork/exec 相当于 Windows spawn。【参考方案2】:

如果你想调用一个外部程序(尤其是不是用 Python 编写的),请使用subprocess

如果要在子进程中调用 Python 函数,请使用 multiprocessing

(如果程序是用 Python 编写的,但也是可导入的,那么我会尝试使用 multiprocessing 调用它的函数,而不是通过 subprocess 在外部调用它。)

【讨论】:

如果它是一个外部程序并且我想在多个处理器上运行它怎么办? 您想多次运行外部程序,还是想以利用多个处理器的方式将外部程序作为单个进程运行? 多次,并行。准确地说,是对多个图像文件进行 OCR。 您可以启动多个non-blocking subprocess.calls。任何现代操作系统都应该在可用处理器上同时运行这些进程。您也可以启动subprocesses from a thread pool 来限制同时启动的子进程数。 你能看看this吗?【参考方案3】:

子进程产生新进程,但除了标准输入/标准输出和其他程序可能实现的任何其他 API 之外,您无法与它们通信。它的主要目的是启动与您自己的程序完全分离的进程。

多处理也会产生新进程,但它们会运行您的代码,并且旨在相互通信。您可以使用它在您自己的程序中跨多个 CPU 内核划分任务。

【讨论】:

"子进程产生新进程 [...] 多进程也产生新进程,但它们运行您的代码",这会阻止子进程模块启动运行您的代码的进程? “并且旨在相互通信”,如果进程可以通信,是什么阻止了子进程模块产生的那些也可以通信? @mins:通过subprocess 生成的进程不能(如果有的话很容易)利用使用multiprocessing.Process 启动的进程可以通信的方式,例如通过multiprocessing.Manager

以上是关于多进程和子进程有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

多线程和多进程模式有啥区别

麻烦解释一下linux下进程和线程有啥区别和联系,linux下多线程和多进程通信的实现方法,请通俗解释

python 多进程和子进程1

什么是父进程和子进程?

Python多处理和子进程的独立性

Heroku中的进程类型和Dynos有啥区别