我啥时候应该在子进程中使用`wait`而不是`communicate`?

Posted

技术标签:

【中文标题】我啥时候应该在子进程中使用`wait`而不是`communicate`?【英文标题】:When should I use `wait` instead of `communicate` in subprocess?我什么时候应该在子进程中使用`wait`而不是`communicate`? 【发布时间】:2012-11-11 10:24:03 【问题描述】:

在等待的文档中(http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait),它说:

警告

当使用 stdout=PIPE 和/或 stderr=PIPE 和 子进程向管道生成足够的输出,使其阻塞 等待操作系统管道缓冲区接受更多数据。使用通信() 避免这种情况。

据此,我认为如果不需要retcodecommunicate 可以替换wait()所有用法。即使stdoutstdin 不是PIPE,我也可以将wait() 替换为communicate()

对吗?谢谢!

【问题讨论】:

communicate 是一种方便的方法,它隐藏了使用轮询、选择或线程 (Windows) 对管道进行读/写的平台相关细节。它最后调用wait。如果它适合您的需要,请使用它,但更复杂的管道可能需要手动处理管道,或使用中间 wait @eryksun wait()的性能会比communicate()更好吗? 我可以想象这样一种情况,您决定在子进程完成运行之前关闭子进程的管道。当(稍后)您想确保它已完成时,wait() 将起作用,但不是communicate(),因为它会被已经关闭的管道混淆。 【参考方案1】:

我怀疑(文档在 2.6 中没有明确说明)在您不使用 PIPE 的情况下,communicate() 被简化为 wait()。因此,如果您使用 PIPE,则应该可以替换 wait()。

在您确实使用 PIPE 的情况下,您可能会溢出内存缓冲区(请参阅communicate() 注释),就像您可以填满 OS 管道缓冲区一样,所以如果您使用任何一个都不会工作'正在处理大量输出。

在一个实用的笔记中,我曾交流过(至少在 2.4 中)给我每行一个字符,这些字符来自基于行输出的程序,委婉地说这没有用。

另外,“不需要重新编码”是什么意思? -- 我相信它设置 Popen.returncode 就像 wait() 一样。

【讨论】:

以上是关于我啥时候应该在子进程中使用`wait`而不是`communicate`?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该继承 EnumMeta 而不是 Enum?

我啥时候应该使用 mongoDB 而不是关系数据库

我啥时候应该使用 CROSS APPLY 而不是 INNER JOIN?

我啥时候应该使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture 来测试字符串是不是相等?

我啥时候应该选择 SAX 而不是 StAX?

我啥时候应该使用一对一的关系?