多进程和子进程有什么区别?

117

我的工作需要使用并行技术,而我是Python的新用户。我想知道您是否可以分享一些有关Python multiprocessingsubprocess模块的资料。这两者之间有什么区别?


潜在地也可以看看 greenlets - 但在理解了您的 OP 所给出的答案之前,请避免使用它们。 - Jon Clements
3个回答

151
< p > < code > subprocess 模块允许您运行和控制其他程序。任何您可以在计算机命令行上启动的内容都可以使用此模块运行和控制。使用它来将外部程序集成到您的Python代码中。

multiprocessing 模块允许您将编写的Python任务分割成多个进程,以提高性能。它提供了一个非常类似于 threading 模块的API; 它提供了方法来跨进程共享数据,并使管理多个进程运行Python代码的任务(更)容易。换句话说,multiprocessing让您利用多个进程通过并行执行代码来更快地完成任务。


14
@glglgl:对于我给你带来的痛苦,我感到很抱歉。谢谢你清理了那个问题。 :-) 现在看看我是否能控制好我的撇号用法! - Martijn Pieters
1
subprocess 模块允许您运行和控制其他程序。 当然,它是使用线程还是进程来运行它们呢?这是一个有趣的细节。似乎它使用线程异步地创建一个新进程,并且该线程继续与进程通信。 - mins
3
新的进程是作为当前进程的一个分支(fork)运行的,然后通过执行execvexecve系统调用来替换子进程。创建新进程时不涉及线程,并且线程也无法加速创建新进程的过程。通信主要由管道(pipes)(即操作系统)处理。如果想使用线程,可以使用,或者可以使用asyncio。由你选择。 - Martijn Pieters
谢谢,我猜fork/exec相当于Windows的spawn - mins

51
如果您想调用外部程序(尤其是非Python编写的程序),请使用subprocess
如果您想在子进程中调用Python函数,请使用multiprocessing
(如果程序是用Python编写的,但也可以导入,则建议尝试使用multiprocessing调用其函数,而不是通过subprocess外部调用它。)

3
如果它是一个外部程序,我想在多个处理器上运行它怎么办? - Mooncrater
你想多次运行外部程序,还是想以一种利用多个处理器的方式将外部程序作为单个进程运行? - unutbu
多次并行地进行OCR处理多个图像文件。 - Mooncrater
2
你可以启动多个非阻塞的subprocess.call。任何现代操作系统都应该能够在可用处理器上并发运行这些进程。你也可以从线程池中启动subprocesses,以限制同时启动的子进程数量。 - unutbu
你能否请看一下这个 - Mooncrater

23

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

多处理也会生成新进程,但它们运行您的代码,并且旨在相互通信。您可以将其用于在多个CPU核心之间划分自己程序中的任务。


子进程生成新的进程[...]多进程也生成新的进程,但它们运行您的代码,是什么阻止了子进程模块启动运行您的代码的进程?"并设计为彼此通信",如果进程可以通信,那么阻止子进程模块生成的进程进行通信呢? - mins
1
@mins:通过subprocess生成的进程不能(或很难)利用使用multiprocessing.Process启动的进程之间的通信方式,例如通过multiprocessing.Manager进行通信。 - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接