【问题标题】:What is the difference between subprocess.Popen() and os.fork()?subprocess.Popen() 和 os.fork() 有什么区别?
【发布时间】:2018-09-12 15:43:09
【问题描述】:

似乎subprocess.Popen()os.fork() 都能够创建子进程。但是,我想知道两者之间有什么区别。你什么时候用哪一个?我尝试查看他们的源代码,但在我的机器上找不到 fork() 的源代码,而且 Popen 在 Unix 机器上的工作方式并不完全清楚。

有人可以详细说明吗?

谢谢

【问题讨论】:

  • 区别在于打开一个进程和分叉它之间的实际区别。看看:stackoverflow.com/questions/2483041/…
  • @Rohi 您的链接解释了线程和进程之间的区别。和这个问题无关。
  • 如果您了解进程是什么(这相当简单),那么您真正需要的是阅读 fork 的作用以了解两者之间的区别(答案中对此进行了很好的解释)。所以我不同意@melpomene
  • @Rohi 你是什么意思,区别? fork 是在 Unix 上创建进程的系统调用。
  • 我的意思是非 unix 方式与 unix 方式之间的区别。非unix方式非常简单,不需要过多解释。 @melpomene

标签: python fork


【解决方案1】:

subprocess.Popen 让您在自己的进程中执行任意程序/命令/可执行文件/任何内容。

os.fork 只允许您创建一个子进程,该子进程将在您调用它的确切行中执行相同的脚本。顾名思义,它“简单地”将当前进程分叉为 2。

os.fork 仅在 Unix 上可用,subprocess.Popen 是跨平台的。

【讨论】:

    【解决方案2】:

    Subprocess.popen() 产生一个新的操作系统级进程。

    os.fork() 创建另一个进程,它将在与该进程完全相同的位置恢复。因此,在第一个循环运行中,您会得到一个分叉,之后您有两个进程,“原始一个”(它获取子进程的 PID 的 pid 值)和分叉的一个(它的 pid 值为 0) .

    【讨论】:

    • Subprocess.popen() 产生一个新的操作系统级进程。”这不是很有帮助,因为这正是 os.fork 所做的。
    【解决方案3】:

    所以我为您阅读了文档。结果:

    • os.fork 只存在于 Unix 上。它创建了一个子进程(通过克隆现有进程),但仅此而已。当它返回时,您有两个(大部分)相同的进程,都运行相同的代码,都从os.fork 返回(但新进程从os.fork 获取0,而父进程获取子进程的PID) .

    • subprocess.Popen 更便携(特别是在 Windows 上工作)。它创建了一个子进程,但您必须指定该子进程应该执行的另一个程序。在 Unix 上,它是通过调用os.fork(克隆父进程),然后调用os.execvp(将程序加载到新的子进程)来实现的。因为Popen 是关于执行程序的,所以它可以让您自定义程序的初始环境。您可以重定向其标准句柄、指定命令行参数、覆盖环境变量、设置其工作目录等。这些都不适用于os.fork

    一般来说subprocess.Popen使用起来更方便。如果你使用os.fork,你需要手动处理很多事情,而且它只适用于 Unix 系统。另一方面,如果你真的想克隆一个进程并且执行一个新程序,os.fork 是最好的选择。

    【讨论】:

    • So I read the documentation for you Snarkiness 让你在那里投了赞成票。如果您有答案,请不要讽刺地给出答案。
    • @mypetlion 你在哪里看到讽刺?
    • 我个人感谢人们为我阅读文档,甚至更多,如果他们提到它来自规范,我倾向于更多地依赖这样的答案。我可以改写为不包括类似讽刺的介绍,但我确实喜欢这个答案,它对我很有用。
    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    相关资源
    最近更新 更多