gpt4 book ai didi

python - 是否可以在 Python 中复制一个管道,使其具有一个写入端和两个读取端?

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:29 24 4
gpt4 key购买 nike

假设我有一个生成一些数据的进程,这些数据被两个相互独立的不同进程使用。

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

如果我只有一个进程使用数据,我可以使用 os.pipe() 将两个进程连接起来,并将数据从一个的输出输送到另一个的输入。

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

最佳答案

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

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

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

您可以在 Python 中做同样的事情,使用一个组合调用 os.pipe()并调用 subprocess.Popen()对于 tee过程,一次调用 subprocess.Popen()对于您要连接的每个进程。

producer = subprocess.Popen(["seq", "3"], stdout=subprocess.PIPE)
pipe_r, pipe_w = os.pipe()
tee = subprocess.Popen(["tee", "/dev/fd/{}".format(pipe_w)],
stdin=producer.stdout, stdout=subprocess.PIPE)
consumer1 = subprocess.Popen(["cat"], stdin=tee.stdout)
consumer2 = subprocess.Popen(["cat"], stdin=pipe_r)
producer.wait()
tee.wait()
consumer1.wait()
consumer2.wait()
os.close(pipe_r)
os.close(pipe_w)

关于python - 是否可以在 Python 中复制一个管道,使其具有一个写入端和两个读取端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com