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

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

【问题讨论】:

标签: python subprocess multiprocessing


【解决方案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
猜你喜欢
  • 2013-08-25
  • 1970-01-01
  • 2017-06-11
  • 2010-09-17
  • 1970-01-01
  • 2012-12-06
  • 2016-01-31
相关资源
最近更新 更多