python blinker库学习
admin
2023-07-31 00:46:07
0

参考 Blinker Documentation
Blinker 是一个基于Python的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播。Flask的信号机制就是基于它建立的。

Blinker的内核虽然小巧,但是功能却非常强大,它支持以下特性:

  • 支持注册全局命名信号
  • 支持匿名信号
  • 支持自定义命名信号
  • 支持与接收者之间的持久连接与短暂连接
  • 通过弱引用实现与接收者之间的自动断开连接
  • 支持发送任意大小的数据
  • 支持收集信号接收者的返回值
  • 线程安全

创建信号

信号通过signal()方法进行创建:

1234 >>> from blinker import signal>>> initialized = signal(\”initialized\”)>>> initialized is signal(\”initialized\”)True

每次调用signal(\'name\')都会返回同一个信号对象。因此这里signal()方法使用了单例模式。

订阅信号

使用Signal.connect()方法注册一个函数,每当触发信号的时候,就会调用该函数。该函数以触发信号的对象作为参数,这个函数其实就是信号订阅者。

123456 >>> def subscriber(sender):...     print(\”Got a signal sent by %r\” % sender)...>>> ready = signal(\’ready\’)>>> ready.connect(subscriber)<function subscriber at 0x…>

触发信号

使用Signal.send()方法通知信号订阅者。

下面定义类Processor,在它的go()方法中触发前面声明的ready信号,send()方法以self为参数,也就是说Processor的实例是信号的发送者。

123456789101112131415161718 >>> class Processor:...    def __init__(self, name):...        self.name = name......    def go(self):...        ready = signal(\’ready\’)...        ready.send(self)...        print(\”Processing.\”)...        complete = signal(\’complete\’)...        complete.send(self)......    def __repr__(self):...        return \'\’ % self.name...>>> processor_a = Processor(\’a\’)>>> processor_a.go()Got a signal sent by Processing.

注意到go()方法中的complete信号没?并没有订阅者订阅该信号,但是依然可以触发该信号。如果没有任何订阅者的信号,结果是什么信号也不会发送,而且Blinker内部对这种情况进行了优化,以尽可能的减少内存开销。

订阅特定的发布者

默认情况下,任意发布者触发信号,都会通知订阅者。可以给Signal.connect()传递一个可选的参数,以便限制订阅者只能订阅特定发送者。

1234567 >>> def b_subscriber(sender):...     print(\”Caught signal from processor_b.\”)...     assert sender.name == \’b\’...>>> processor_b = Processor(\’b\’)>>> ready.connect(b_subscriber, sender=processor_b)<function b_subscriber at 0x…>

现在订阅者只订阅了processor_b发布的ready信号:

1234567 >>> processor_a.go()Got a signal sent by Processing.>>> processor_b.go()Got a signal sent by Caught signal from processor_b.Processing.

通过信号收发数据

可以给send()方法传递额外的关键字参数,这些参数会传递给订阅者。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...