我啥时候应该在子进程中使用`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 和 子进程向管道生成足够的输出,使其阻塞 等待操作系统管道缓冲区接受更多数据。使用通信() 避免这种情况。
据此,我认为如果不需要retcode
,communicate
可以替换wait()
的所有用法。即使stdout
或stdin
不是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`?的主要内容,如果未能解决你的问题,请参考以下文章
我啥时候应该使用 CROSS APPLY 而不是 INNER JOIN?
我啥时候应该使用 StringComparison.InvariantCulture 而不是 StringComparison.CurrentCulture 来测试字符串是不是相等?