什么情况下Popen.communicate()不够用?

5 投票
1 回答
852 浏览
提问于 2025-04-16 06:41

我发现有很多讨论这个话题的帖子,但几乎没有完整的答案……我希望能得到你们的建议。

我的问题是:我需要和一个子进程进行双向通信,也就是说,我需要把很多数据写入它的输入,同时又要实时获取它的输出。这个需求是必须的。我的子进程是著名的“lame” mp3 编码器,输入是我函数生成的一个小时或更长时间的 PCM 音频,输出是 mp3 文件,这个文件也必须分块发送给用户,而不需要等编码器完成。

根据文档,Popen.communicate() 对我处理几十或几百兆字节的进程间通信没有帮助。同时,我从这里了解到,从零开始尝试创建这种方法是非常危险的,因为会有很多陷阱,比如死锁、缓冲、进程管理等等。

所以,我的问题是:有没有什么比较成熟的解决方案,比如一个 Python 库或者代码示例,真的能解决这个问题?或者至少有没有文章或资料清楚地描述了在自己尝试解决这个问题时可能遇到的大部分问题?

提前谢谢你们,
伊利亚。

1 个回答

2

最简单的方法是把你的程序分成两个部分:一个部分负责写入LAME,另一个部分负责从LAME读取数据并把结果展示给用户。这样做比实现双向通信要简单得多。

如果这个方法不适合你,我发现使用命名管道进行开发比传统的管道进程间通信要简单得多。在测试过程中,使用各种管道也很方便。Python 3中的非阻塞I/O应该会让访问这些管道变得更容易。

撰写回答