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实现简单登录验证
Apr 13 Python
python中装饰器级连的使用方法示例
Sep 29 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
python exit出错原因整理
Aug 31 Python
Django集成富文本编辑器summernote的实现步骤
May 31 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 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/11/24 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
php字符集转换
2017/01/23 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
微信小程序实现分享商品海报功能
2019/09/30 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
为什么相对PHP黑python的更少
2020/06/21 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
python生成word合同的实例方法
2021/01/12 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
薇姿法国官网:Vichy法国
2021/01/28 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
畜牧兽医本科生的自我评价
2014/03/03 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript