是否可以在Python中复制管道,以便它有一个写入结束但有两个读取结束?

时间:2013-08-09 17:12:58

标签: python subprocess multiprocessing

假设我有一个生成一些数据的进程,并且这些数据由两个彼此独立的不同进程使用。

解决此问题的一种方法是将生成的数据写入文件,然后从文件中读取其他两个进程。如果文件的大小不大,这将正常工作,但如果有大量数据,IO会变得昂贵。

如果我只有一个进程消耗数据,我可以使用os.pipe()连接这两个进程,并将一个输出的漏斗数据连接到另一个进程的输入。

但是,由于我有两个消费者流程,我不确定是否有一种方法可以复制管道的读取端,以便消费者都可以从中读取。

2 个答案:

答案 0 :(得分:2)

来自管道的数据只能读取一次。但是,您可以使用简单复制数据并将其写入两个不同文件描述符的中间过程。在Unix系统上,这是由标准工具tee完成的。 POSIX shell中的一个例子:

$ exec 4> a
$ seq 3 | tee /dev/fd/4 > b

这会将seq 3的输出写入两个文件ab

你可以在Python中做同样的事情,使用os.pipe()的一次调用和subprocess.Popen()进程的tee调用,以及对{{1}的一次调用对于您要连接的每个进程。

subprocess.Popen()

答案 1 :(得分:0)

因为它是一个由管道返回的文件描述符,我很遗憾地说你不能回去;但是,一个想法是让读者进程将数据添加到multiprocessing.Queue,其中两者都可以读出并随后丢弃数据。

您也可以随时从编写器进程到每个读者都有一个管道。还有其他一些内容,例如shared memorydbus,您可以使用这些内容围绕数据进行传播。

你能更深入地描述你的问题吗?

根据平台的不同,您也可以让流程使用多个流 - 例如stdout和第四个 - 但这在OS之间是不可移植的。