文章目录
简介
blinker
是一个轻量级的 Python 库,用于实现信号(Signals)机制,帮助开发者在应用程序中解耦不同的组件。它允许一部分代码发送信号,而其他部分可以监听这些信号并作出响应,从而实现了事件驱动的编程模式。flask中也是使用了这个库实现了一些常用信号例如appcontext_popped
当上下文被弹出时发送信号给接收者。
一、创建命名空间
如果没有安装请使用pip install blinker
。
其实这就是一个包装后的字典。
代码如下
from blinker import Namespace
# 创建命名空间
my_signals = Namespace()
二、基本使用
创建信号
使用Namespace中的signal函数可以创建一个信号( NamedSignal
对象)
代码如下
new_signal = my_signals.signal('新建信号', doc='这是新建信号的说明')
这个源代码并不复杂,查看后可以发现,是创建一个NameSignal
对象并将其绑定到当前对象上,前面有说Namespace是一个扩展了过后的字典对象。
订阅信号
订阅信号有2种方式,直接订阅和装饰器
首先是第一种:直接订阅
代码如下
#定义一个接收者函数,第一个参数必须是信号的发送者给的信息(后面会讲), 后面就是可选参数,可以自己灵活配置。
def receiver(sender, **kwargs):
print("接收到信号:")
print(f"发送者的消息:{sender}")
print(f"发送过来的参数是{kwargs}")
func = new_signal.connect(receiver)#它会返回receiver本身。它里面其实就是用了receiver的id做了唯一标识符。
然后就是第二种:装饰器
from blinker import ANY#这个表示接收者会在任何发送者发出信号时被调用
@new_signal.connect_via(ANY)
def receiverV2(sender, **kwargs):
print("*"*50)
print("接收到信号:")
print(f"发送者的消息:{sender}")
print(f"发送过来的参数是{kwargs}")
print("\n\n\n")
其实内部也是调用了connect
发送信号
使用send方法即可完成发送
代码如下
receiver_s = new_signal.send("发送者", arg1='参数1', arg2='参数2')
print(receiver_s)
运行结果如下
send返回一个列表,其元素是一个二元组,其第一个元素是接收者本身,第二个元素是接收者被调用时返回的参数。
三、提高
前面有讲到订阅的时候有sender参数,默认时ANY表示任何发送者发出信号时都会被调用。其实这个就像是一个key只有当send时给出指定的key时才会触发相应的订阅者。
给个示例
def receiverV3(sender, **kwargs):
print("="*50)
print("接收到信号:")
print(f"发送者的消息:{sender}")
print(f"发送过来的参数是{kwargs}")
print("="*50)
new_signal.connect(receiverV3, sender="V3")#这里给个字符串V3当它的键
new_signal.send()
运行结果如下:
new_signal.send(sender="V3")
运行结果如下
可以看到只有当send时的sender参数是订阅时的sender参数时,订阅者函数才会调用。
总结
本文介绍blinker的基本用法,并通过实例介绍了如何使用信号和槽函数。
槽函数(Slot Function)是信号与接收器(或称为侦听器)间的一种工作机制,特别是在事件驱动编程中广泛使用。槽函数是一个特定的可调用对象(如函数或方法),它被连接到事件源(如信号)上,当事件发生时,槽函数会被自动调用以响应这个事件。 标签:blinker,sender,signal,send,发送者,信号,使用,print From: https://blog.csdn.net/2301_79920669/article/details/144722456