2010-11-06 27 views
5

我发现很多线程或多或少与这个主题相关,并且仍然几乎没有像完整的答案......我正在寻找你的建议。当Popen.communicate()不够?

所以,这里是我的问题:我真的需要在这两个方面与子进程进行通信:我要赖特大量的数据,以它的输入并获取其上飞输出。没有其他办法了。我的子过程是着名的'lame'mp3编码器,输入是由我的函数产生的一个小时或更长时间的PCM声音,输出是也不得不等待编码器完成的,还必须通过块发送给用户块的mp3文件。

根据文档,Popen.communicate()绝不会帮我处理IPC几十或几百兆的测量。与此同时,正如我从这里学到的,尝试从头开始创建这种方法非常危险,因为很多陷阱正在等待:死锁,缓冲,进程管理等。

所以,我的问题是:是否有这种问题的一些众所周知的解决方案:一个python库或代码示例真的能解决这个问题?可能至少有一篇文章或一些东西清楚地描述了人们可以通过自己来解决这个问题的大多数问题?

谢谢你在前进,伊利亚 。

回答

2

最简单的方法就是分裂你两个自己的程序:其中一个写入LAME和从跛脚读取和写入到用户的其他。这比做双向通信容易得多。

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

+0

如果我有你的想法,我要推出三个子过程:一个用于创建输入数据,并将其写入瘸,一到执行的是跛脚本身和一个获得输出,并将其传送到用户。这里让我感到害怕的是,我必须执行整个监督逻辑:等待孩子,捕捉信号并在父出口处杀死孩子,反过来等等。 – izhak 2010-11-06 21:33:32

+0

至于Python 3中的NB - 谢谢,我会读它。不幸的是,这个特定的任务必须在Python 2.4的一些共享主机上运行,​​这是一个可悲的现实。 – izhak 2010-11-06 21:35:41

+0

这三个孩子正是我想到的。但是你是对的,实施起来仍然很烦人。有关这些问题的最佳讨论仍然是UNIX环境下的高级编程 - 请参阅http://www.kohala.com/start/apue.html - 我强烈建议。 – max 2010-11-07 09:01:13