当 Popen.communicate() 还不够?

Posted

技术标签:

【中文标题】当 Popen.communicate() 还不够?【英文标题】:When Popen.communicate() is not enough? 【发布时间】:2010-11-06 20:39:06 【问题描述】:

我发现了很多与该主题或多或少相关的主题,但仍然几乎没有完整的答案......我正在寻找你的建议。

所以,这是我的问题:我确实需要以两种方式与子进程进行通信:我必须将大量数据写入其输入并即时获取其输出。没有其他办法了。我的子进程是著名的“lame”mp3 编码器,输入是我的函数生成的一个小时或更长时间的 PCM 声音,输出是 mp3 文件,该文件也必须逐块发送给用户,而无需等待编码器完成。

根据文档,Popen.communicate() 无法帮助我处理以数十或数百兆字节为单位的 IPC。同时,正如我从这里了解到的,尝试从头开始创建这种方法是非常危险的,因为有很多陷阱在等待:死锁、缓冲、进程管理等。

所以,我的问题是:对于这类问题是否有一些众所周知的解决方案:真正解决问题的 python 库或代码示例?可能至少有一篇文章或其他内容清楚地描述了一个人尝试自己解决这个问题时可能遇到的大多数问题?

提前谢谢你, 伊利亚。

【问题讨论】:

【参考方案1】:

最简单的方法是将您自己的程序分成两部分:一个写入 LAME,另一个从 lame 读取并写入用户。这比双向通信要容易得多。

如果这对您不起作用,我发现使用命名管道进行开发比传统管道 IPC 容易得多。在测试过程中很容易使用各种管道。 Nonblocking I/O in Python 3 应该使访问它们变得更加容易。

【讨论】:

如果我明白了你的想法,我必须启动三个子进程:一个用于创建输入数据并将其写入 lame,一个用于执行 lame 本身,一个用于获取输出并将其传输给用户。这里让我害怕的是我必须实现整个监督逻辑的想法:等待孩子,捕捉信号并在父母出口处杀死孩子,反之亦然等等。 至于 Python 3 中的 NB - 谢谢,我会读的。不幸的是,这个特定的任务必须在几个共享主机上运行,​​而 Python 2.4 是一个可悲的现实。 三个孩子正是我的想法。但是您是对的,实施起来仍然很烦人。对这些问题的最佳讨论仍然是 UNIX 环境中的高级编程 - 请参阅 kohala.com/start/apue.html - 我强烈推荐。

以上是关于当 Popen.communicate() 还不够?的主要内容,如果未能解决你的问题,请参考以下文章

了解 Popen.communicate

带有标准输入的 subprocess.Popen.communicate() 的管道损坏

python popen.communicate() 与多个标准输入写入

为啥 Popen.communicate() 返回 b'hi\n' 而不是 'hi'?

Unix Popen.communicate无法gzip大文件

Python Popen communicate 和wait使用上的区别