Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

python blinker 库学习

$
0
0
python blinker 库学习

一点号数据玩家昨天

限时干货下载:

回复【2】免费获取【超全数据分析资料免费下载(包含SQL,R语言,SPSS,SAS,python,数据挖掘)!】

来源:segmentfault.com/a/1190000005814855

作者:fireflow

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

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

1

创建信号

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

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

2

订阅信号

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


php?url=0E7AFHRugs" alt="python blinker 库学习" />

3

订阅信号

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

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


python blinker 库学习

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

4

订阅特定的发布者

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


python blinker 库学习
python blinker 库学习

5

通过信号收发数据

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


python blinker 库学习

send方法的返回值收集每个订阅者的返回值,拼接成一个元组组成的列表。每个元组的组成为(receiver function, return value)。

6

匿名信号

前面我们创建的信号都是命名信号,每次调用Signal构造器都会创建一个唯一的信号,,也就是说每次创建的信号是不一样的。下面对前面的Processor类进行改造,将signal作为它的类属性。


python blinker 库学习

上面创建的就是匿名信号。on_ready与on_complete是两个不同的信号。

7

使用修饰器订阅信号

除了使用connect方法订阅信号之外,使用@connect修饰器可以达到同样的效果。


python blinker 库学习

尽管这样用起来很方便,但是这种形式不支持订阅指定的发送者。这时,可以使用connect_via:


python blinker 库学习

8

优化信号发送

信号通常会进行优化,以便快速的发送。不管有没有订阅者,都可以发送信号。如果发送信号时需要传送的参数要计算很长时间,可以在发送之前使用receivers属性先检查一下是否有订阅者。


python blinker 库学习

还可以检查订阅者是否订阅了某个具体的信号发布者。


Viewing all articles
Browse latest Browse all 9596

Trending Articles