推荐的Python发布/订阅/分发模块是什么?

31 投票
7 回答
35545 浏览
提问于 2025-04-11 09:18

来自 PyPubSub 的内容:

Pypubsub 提供了一种简单的方法,让你的 Python 应用程序的各个部分可以独立工作:应用的某些部分可以发布消息(可以带数据,也可以不带),而其他部分可以订阅或接收这些消息。这种方式让消息的“发送者”和“接收者”彼此之间并不需要了解对方:

  • 一个部分不需要引入另一个部分
  • 发送者不需要知道
    • “谁”会收到这些消息,
    • 接收者会对数据做什么,
    • 甚至不需要知道是否有接收者会收到这些消息。
  • 同样,接收者也不需要担心消息来自哪里。

这是一种很好的工具,可以用来实现模型-视图-控制器(Model-View-Controller)架构,或者任何类似的架构,这种架构鼓励各个部分之间的独立性。

网上似乎有很多 Python 模块可以用来发布和订阅消息,从 PyPubSub 到 PyDispatcher,还有一些简单的“自制”类。

在比较不同模块时,有没有具体的优缺点?哪些模块的性能已经被测试和比较过?

提前谢谢你!

7 个回答

3

这里有一个新的库:https://github.com/shaunduncan/smokesignal。"smokesignal 是一个简单的 Python 库,用于发送和接收信号。它受到 Django 信号框架的一些启发,但它是一个通用的版本。" 示例:

from time import sleep
import smokesignal

@smokesignal.on('debug')
def verbose(val):
    print "#", val


def main():
    for i in range(100):
        if i and i%10==0:
            smokesignal.emit('debug', i)
        sleep(.1)

main()
4

对于Python来说,最好的调度包似乎是Django里的一个叫做dispatch模块(在文档中称为signals)。这个模块和Django的其他部分没有依赖关系,内容简洁,文档齐全,经过测试,而且写得非常好。

补充:我把这个项目分支出来,做成了一个独立的信号项目,专门用于Python。

16

PyDispatcherDjango 中被广泛使用,对我来说运行得非常好(我想对整个Django社区来说也是如此)。

我记得有一些性能问题:

  • PyDispatcher进行参数检查的时候比较慢。
  • 一些未使用的连接会带来不必要的负担。

据我所知,在小到中型的应用程序中,你很可能不会遇到这些问题。所以这些问题可能对你来说并不重要。如果你觉得每一点性能都很重要(过早优化是万恶之源!),你可以看看Django对PyDispatcher所做的修改。

希望这些信息对你有帮助。

撰写回答