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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
python3爬虫怎样构建请求header
Dec 23 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
Django框架获取form表单数据方式总结
Apr 22 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 Python
python基础入门之字典和集合
Jun 13 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
Elasticsearch 数据类型及管理
Apr 19 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 采集书并合成txt格式的实现代码
2009/03/01 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
php如何获取文件的扩展名
2015/10/28 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
Python编写生成验证码的脚本的教程
2015/05/04 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
Django密码存储策略分析
2020/01/09 Python
Python内置函数locals和globals对比
2020/04/28 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
会计岗位职责
2013/11/08 职场文书
教师自荐信范文
2013/12/09 职场文书
理财计划书
2014/08/14 职场文书
初一语文教学反思
2016/03/03 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书