具有单个输入和多个输出的Python管道

问题描述 投票:0回答:1

我熟悉multiprocessing.Pipe,但我正在寻找可以复制输入数据并将其发送给多个输出使用者的东西。我知道队列支持多个使用者,但是在这种情况下,每条输入消息只会发送给一个使用者,而不是所有使用者。

我希望每个输入对象都能输出到每个使用者:

              ↱ Output A
Input -> Pipe → Output B
              ↳ Output C

我希望输出使用者的数量能够在运行时进行更改。我不需要双向数据流。似乎可以将其称为pub / sub模式,但我找不到用于本地的任何实现。

我想我可以用三个(或n个)单独的管道来实现这一点,并对其进行迭代以将输入写入每个管道中,但这似乎不是一种可伸缩/简洁的方法。

有什么想法吗?

python python-multiprocessing publish-subscribe
1个回答
0
投票

如Tadhg所建议,这是我的幼稚方法,以及一些简短的测试代码:

from multiprocessing import Pipe

class PubSub(object):
    _consumers = set()

    def send(self, obj):
        for consumer in self._consumers:
            consumer[0].send(obj)

    def subscribe(self):
        new_pipe = Pipe()
        self._consumers.add(new_pipe)
        return new_pipe[1]

    def unsubscribe(self, pipe):
        for consumer in self._consumers:
            if consumer[1] == pipe:
                self._consumers.remove(consumer)
                return


if __name__ == "__main__":
    import pubsub
    a = pubsub.PubSub()
    z = a.subscribe()
    y = a.subscribe()
    x = a.subscribe()

    a.send("fred")
    print(z.recv()) # fred
    print(y.recv()) # fred
    print(x.recv()) # fred

    a.unsubscribe(x)
    a.send("derf")
    print(z.recv()) # derf
    print(y.recv()) # derf
    print(x.recv()) # Traceback: EOFError

我确定有比赛条件在等我;-)

© www.soinside.com 2019 - 2024. All rights reserved.