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

时间:2019-12-11 02:56:47

标签: python python-multiprocessing publish-subscribe

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

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

from multiprocessing import Pipe

class PubSub(object):
    _consumers = set()

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

    def subscribe(self):
        new_pipe = Pipe(duplex=False)
        self._consumers.add(new_pipe)
        return new_pipe[0]

    def unsubscribe(self, pipe):
        for consumer in self._consumers:
            if consumer[0] == 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

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