信号与发布-订阅有什么不同?

30 投票
2 回答
5297 浏览
提问于 2025-04-16 13:01

Django和Flask都使用信号,Flask使用的是Blinker这个库。在Python的环境下,Blinker和Python的pubsub库有什么区别呢?我应该什么时候使用其中一个呢?

2 个回答

6

这段内容可以帮助你理解Pubsub是如何与信号相关的:http://pubsub.sourceforge.net/apidocs/concepts.html

Pubsub的作用是让应用程序中的不同部分(比如可调用的函数、模块、包)之间可以更独立地工作。它是通过以下方式实现的:

  • 让应用程序的某些部分可以发送消息给“应用程序的其他部分”,而不需要知道:
    • 消息是否会被处理:
      • 可能这个消息会被完全忽略,
      • 或者会被应用程序的多个部分处理;
    • 消息会如何被处理:
      • 消息及其内容会被做什么;
      • 任何给定的消息会以什么顺序发送给应用程序的其他部分;
  • 让应用程序的某些部分可以接收和处理来自“应用程序其他部分”的消息,而不需要知道是谁发送的消息。

监听器是“想要接收消息的应用程序部分”。监听器会订阅一个或多个主题。发送者是任何请求Pubsub发送特定主题消息的应用程序部分。发送者会提供数据(如果有的话)。Pubsub会把消息和任何数据发送给所有订阅了该主题的监听器。

16

Blinker 文档PubSub 文档

关于 BlinkerPubSub,它们其实是同一种东西。主要的区别在于它们的使用方式:

使用 Blinker 时,当你想要订阅一个信号的时候,你需要告诉它这个信号的名字;而当你想要激活这个信号时,你需要传入一个激活的对象。

而使用 PubSub 时,当你订阅一个监听器时,你同样需要提供名字(和 Blinker 一样),但是当你想要通知这个监听器时,你直接把数据作为关键字参数传递过去。因为这种关键字参数的方式,可以让 PubSub 有更多的安全检查。

就个人而言,我更倾向于使用 Blinker,因为它更符合我的思维方式,但 PubSub 也有它的用处。

撰写回答