python 教程之blinker 信号库
作者:autofelix 时间:2023-11-23 10:15:51
一、安装
一个基于
Python
的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播支持注册全局命名信号,支持自定义命名信号
支持匿名信号,线程安全
支持与接收者之间的持久连接与短暂连接
通过弱引用实现与接收者之间的自动断开连接
支持发送任意大小的数据,支持收集信号接收者的返回值
pip install blinker
二、创建发送信号
信号通过
signal()
方法进行创建信号通过
send()
方法进行发送
from blinker import signal
# 创建一个信号,并给信号命名
s = signal('autofelix')
def say(args):
print('我是飞兔小哥')
# 信号注册一个接收者
s.connect(say)
if "__main__" == __name__:
# 发送信号
s.send()
三、匿名信号
blinker
也支持匿名信号,就是不需要指定一个具体的信号值创建的每一个匿名信号都是互相独立的
from blinker import signal
# 创建一个匿名信号
s = signal()
def say(args):
print('我是飞兔小哥')
# 信号注册一个接收者
s.connect(say)
if "__main__" == __name__:
# 发送信号
s.send()
四、组播信号
组播信号是比较能体现出信号优点的特征
多个接收者注册到信号上,发送者只需要发送一次就能传递信息到多个接收者
from blinker import signal
s = signal('autofelix')
def fans_one(args):
print(f'我是粉丝一号,我关注了: {args}')
def fans_two(args):
print(f'我是粉丝二号,我关注了: {args}')
s.connect(fans_one)
s.connect(fans_two)
if "__main__" == __name__:
s.send('飞兔小哥')
五、接受方订阅主题
只有当指定的主题发送消息时才发送给接收方
from blinker import signal
s = signal('autofelix')
def fans(args):
print(f'我是个小粉丝,{args} 是我的老师')
# 信号注册一个接收者, 并指定主题
s.connect(animal, sender='飞兔')
if "__main__" == __name__:
for i in ['飞兔', '飞兔小姐姐', '飞兔小哥哥']:
s.send(i)
六、装饰器用法
除了可以函数注册之外还有更简单的信号注册方法,那就是装饰器
from blinker import signal
s = signal('autofelix')
@s.connect
def fans_one(args):
print(f'我是粉丝一号,我关注了: {args}')
@s.connect
def fans_two(args):
print(f'我是粉丝二号,我关注了: {args}')
if "__main__" == __name__:
s.send('飞兔小哥')
七、订阅主题的装饰器
connect 的注册方法用着装饰器时有一个弊端就是不能够订阅主题
connect_via 方法支持订阅主题
from blinker import signal
s = signal('autofelix')
@s.connect_via('飞兔')
def fans(args):
print(f'我是个小粉丝,{args} 是我的老师')
if "__main__" == __name__:
for i in ['飞兔', '飞兔小姐姐', '飞兔小哥哥']:
s.send(i)
八、检查信号是否有接收者
如果对于一个发送者发送消息前要准备的耗时很长
为了避免没有接收者导致浪费性能的情况
可以先检查某一个信号是否有接收者
在确定有接收者的情况下才发送
from blinker import signal
a1 = signal('autofelix-1')
a2 = signal('autofelix-2')
def fans(sender):
print('我是个小粉丝')
a1.connect(fans)
if "__main__" == __name__:
res = a1.receivers
print(res)
if res:
a1.send()
res = a2.receivers
print(res)
if res:
a2.send()
else:
print("我是个偶像")
九、是否订阅了某个信号
检查订阅者是否由某一个信号
from blinker import signal
a1 = signal('autofelix-1')
a2 = signal('autofelix-2')
def fans(sender):
print('我是个小粉丝')
a1.connect(fans)
if "__main__" == __name__:
res = a1.has_receivers_for(fans)
print(res)
res = a2.has_receivers_for(fans)
print(res)
来源:https://blog.51cto.com/autofelix/5260719
标签:python,blinker,信号库
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
PHP PDOStatement::errorCode讲解
2023-06-11 12:40:23
python从gbff文件中直接提取cds序列
2023-05-29 16:10:35
python的mysql数据库建立表与插入数据操作示例
2024-01-22 22:27:32
python使用Tkinter显示网络图片的方法
2021-09-26 18:25:38
根据表名和索引获取需要的列名的存储过程
2024-01-23 04:24:14
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2024-04-22 22:20:39
asp MD5加密方式使用建议
2011-03-30 11:17:00
pandas数据清洗,排序,索引设置,数据选取方法
2023-06-13 15:08:45
PHP之深入学习Yii2缓存Cache组件详细讲解
2023-06-29 17:37:20
![](https://img.aspxhome.com/file/2023/1/55561_0s.jpg)
python字符串,数值计算
2022-12-28 11:20:32
mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程
2024-01-20 04:46:35
![](https://img.aspxhome.com/file/2023/6/71096_0s.jpg)
从web到内网渗透的一次过程详解
2023-05-20 21:23:08
![](https://img.aspxhome.com/file/2023/7/83267_0s.jpg)
Centos6.5下Jdk+Tomcat+Mysql环境安装图文教程
2024-01-23 04:35:10
![](https://img.aspxhome.com/file/2023/7/86707_0s.jpg)
python异常中else的实例用法
2021-02-05 06:18:56
div + ajax + 分页函数
2009-10-18 11:28:00
asp彩色验证码的制作详解
2007-09-18 13:22:00
jQuery实现同一点击,两个不同链接,指向两个不同的iframe
2010-06-21 10:52:00
详解python函数传参传递dict/list/set等类型的问题
2021-09-29 16:12:38
利用Python操作excel表格的完美指南
2022-05-21 07:59:09
![](https://img.aspxhome.com/file/2023/2/120972_0s.png)
Python学习之函数 def
2022-09-06 09:57:41