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爬虫之抓取糗事百科代码分享
Nov 06 Python
python中的代码编码格式转换问题
Jun 10 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
Python装饰器用法示例小结
Feb 11 Python
深入浅析Python传值与传址
Jul 10 Python
Python基础知识点 初识Python.md
May 14 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
python算的上脚本语言吗
Jun 22 Python
Python执行时间的几种计算方法
Jul 31 Python
django前端页面下拉选择框默认值设置方式
Aug 09 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
详解JavaScript函数
2015/12/01 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
简单谈谈python基本数据类型
2018/09/26 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
浅析NumPy 切片和索引
2020/09/02 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
小学校长个人总结
2015/03/03 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
离婚被告代理词
2015/05/23 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
python获取带有返回值的多线程
2022/05/02 Python