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

30

Django和Flask都使用信号——后者使用Blinker库。在Python的上下文中,Blinker和Python的pubsub库,信号和发布订阅有什么区别?我应该在什么情况下使用其中之一?


我有点希望从已经走过这条路的人那里得到一个明确的答案,比如“它们是一样的”或“PubSub通常涉及X,而信号通常意味着Y”。 - a paid nerd
2个回答

16

Blinker文档PubSub文档

就 Blinker 和 PubSub 而言,它们是同一件事。区别在于它们的处理方式:

使用 Blinker 时,当您订阅一个信号时,需要给出信号名称,当您激活信号时,则要传递激活对象。

使用 PubSub 时,当您订阅一个侦听器时,也需要给出名称(与 Blinker 相同),但是当您通知侦听器时,则直接将数据作为关键字参数传递。由于使用关键字参数传递数据的方法,因此可以使用 PubSub 进行更多的安全检查。

个人而言,我会选择 Blinker,因为它更符合我的思维方式,但是 PubSub 也肯定有其应用场景。


6
这可能会清楚地解释Pubsub与信号的关系:http://pubsub.sourceforge.net/apidocs/concepts.html Pubsub通过以下方式促进应用程序中组件(可调用项、模块、包)的解耦:
- 允许应用程序的某些部分向“应用程序的其余部分”发送消息,而无需知道: - 消息是否会被处理: - 可能完全忽略该消息, - 或由应用程序的多个不同部分处理; - 消息将如何处理: - 将对消息及其内容执行什么操作; - 任何给定消息将按什么顺序发送到应用程序的其余部分。 - 允许应用程序的某些部分从“应用程序的其余部分”接收并处理消息,而无需知道谁发送了消息。
监听器是“希望接收消息的应用程序的一部分”。监听器订阅一个或多个主题。发送方是请求Pubsub发送给定主题的消息的应用程序的任何部分。发送方提供数据(如果有)。 Pubsub将消息(包括任何数据)发送到该消息主题的所有侦听器。

3
所有这些东西难道不也适用于信号和接收器吗? - matthewwithanm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接