27

来自PyPubSub

Pypubsub 为您的 Python 应用程序提供了一种简单的方法来解耦其组件:应用程序的一部分可以发布消息(有或没有数据),而其他部分可以订阅/接收它们。这允许消息“发送者”和消息“侦听者”彼此不知道:

  • 一个不需要导入另一个
  • 发件人不需要知道
    • “谁”收到消息,
    • 听众将如何处理数据,
    • 或者即使任何侦听器都会获取消息数据。
  • 同样,听众也不必担心消息来自哪里。

这是实现模型-视图-控制器架构或任何促进其组件解耦的类似架构的绝佳工具。

从 PyPubSub 到PyDispatcher再到简单的“自制”类,似乎有相当多的 Python 模块用于发布/订阅。

在比较不同的不同模块时,是否有特定的优缺点?哪些模块集进行了基准测试和比较?

提前致谢

4

7 回答 7

16

PyDispatcherDjango中被大量使用,它对我来说非常有效(我猜对整个 Django 社区来说也是如此)。

我记得,有一些性能问题:

  • PyDispatcher 进行的参数检查很慢。
  • 未使用的连接有不必要的开销。

AFAIK 您不太可能在中小型应用程序中遇到此问题。因此,这些问题可能与您无关。如果您认为您需要每一磅性能(过早的优化是万恶之源!),您可以查看对 Django 中的 PyDispatcher 所做的修改。

希望这可以帮助。

于 2008-09-22T18:44:43.627 回答
4

python 最好的调度包似乎是django中的调度模块(在文档中称为信号)。它独立于 django 的其余部分,并且简短、有文档、经过测试并且编写得非常好。

编辑:我将该项目分叉为 Python的独立信号项目。

于 2010-04-03T21:13:25.987 回答
2

我最近仔细查看了py-amqplib作为 RabbitMQ 代理的 AMQP 客户端。后一个工具是用 Erlang 编写的。

如果您希望解耦您的应用程序。那为什么要把它和语言本身结合起来呢?考虑使用语言中立的消息队列,然后你真的有成长的空间!

话虽如此,AMQP 需要努力去理解,如果你的应用程序可能比你愿意承担的更多。工作正常。YMMV。

于 2008-09-22T19:19:31.733 回答
2

我发现一些尚未提及的库:

于 2009-06-01T23:03:28.510 回答
2

这是一个较新的: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()
于 2013-06-04T12:45:37.990 回答
1

还有 PJ Eby、RuleDispatch 和 PEAK 项目的库,特别是 Trellis。我不知道他们的实际状态,但邮件列表非常活跃。

PyPi 上的最后一个 Trellis 版本

格子文档

我还使用了来自 BBC 的Kamaelia 项目的组件。Axon 是一种有趣的方法,但比出版商和消费者的灵感更多。好吧,它的网站根本不是最新的……Google SoC 2008 中有一个或 2 个项目,工作正在进行中。

不知道有没有帮助:)

编辑:我刚刚发现Py-notify是观察者模式的“非正统”实现。它具有我自己的工具所需的大部分功能。

于 2008-09-22T20:52:03.947 回答
0

PyPubSub 似乎是一个管理混乱的项目(SF 上的 Wiki 已死,SF 上链接的网站(另一个 Wiki)目前已损坏)这一事实就足以让我有理由不使用它。PyDispatcher 有一个完整的网站,但他们似乎提供的唯一文档是从文档字符串生成的 API 的文档。邮件列表上也没有流量……一个不好的迹象!

正如 Mike 还提到的,完全可以选择独立于 Python 的解决方案。现在不要误会我的意思,我喜欢Python,但在这个领域,使用与编程语言分离的框架仍然是有意义的。

我对消息传递没有经验,但我打算研究一些解决方案。到目前为止,这两个(免费、开源)项目对我来说似乎是最有前途的(巧合的是,它们都是 Apache 项目):

两者似乎都是相当成熟的项目,至少就文档和社区而言。不过,我无法评论该软件的质量,正如我所说,我没有使用任何软件。

Qpid 附带 Python 的客户端库,但您也可以使用py-amqplib。对于 ActiveMQ,有pyactivemq,您可以使用它通过 STOMP(面向流文本的消息传递协议)或通过 Openwire 进行连接。

于 2009-02-17T13:28:17.127 回答