python blinker 信号库


Posted in Python onMay 04, 2022

一、安装

  • 一个基于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)

到此这篇关于python 教程之blinker 信号库的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
深入理解Python中字典的键的使用
Aug 19 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
Python算法之图的遍历
Nov 16 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
对python中return与yield的区别详解
Mar 12 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 Python
python接口测试返回数据为字典取值方式
Feb 12 Python
python三子棋游戏
May 04 #Python
python神经网络 使用Keras构建RNN训练
May 04 #Python
python神经网络学习 使用Keras进行回归运算
May 04 #Python
python神经网络学习 使用Keras进行简单分类
May 04 #Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 #Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 #Python
python开发制作好看的时钟效果
You might like
如何在PHP中进行身份认证
2006/10/09 PHP
php 无限分类的树类代码
2009/12/03 PHP
php如何获取文件的扩展名
2015/10/28 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
分页栏的web标准实现
2011/11/01 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
JS中去掉array中重复元素的方法
2017/05/26 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python生成器的使用方法
2013/11/21 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Windows下python3.7安装教程
2018/07/31 Python
python异常触发及自定义异常类解析
2019/08/06 Python
pycharm运行scrapy过程图解
2019/11/22 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
python中四舍五入的正确打开方式
2021/01/18 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
大学四年规划书范文
2013/12/27 职场文书
最新党员思想汇报
2014/01/01 职场文书
司马光教学反思
2014/02/01 职场文书
父母对孩子的寄语
2014/04/09 职场文书
冬季施工防火方案
2014/05/17 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
五年级作文之劳动作文
2019/11/12 职场文书