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批量制作雷达图的实现方法
Jul 26 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python交互式图形编程实例(一)
Nov 17 Python
Django 使用logging打印日志的实例
Apr 28 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python简单区块链模拟详解
Jul 03 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
详解python polyscope库的安装和例程
Nov 13 Python
Python jieba库分词模式实例用法
Jan 13 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
python如何为list实现find方法
May 30 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
2020最新CPU的性能排名
2020/04/02 数码科技
PHP 事务处理数据实现代码
2010/05/13 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
PHP中的事务使用实例
2015/05/26 PHP
php将html转为图片的实现方法
2017/05/19 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python中的tuple元组详细介绍
2015/02/02 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
keras之权重初始化方式
2020/05/21 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
幼儿园家长评语
2014/02/10 职场文书
教职工代表大会主持词
2014/04/01 职场文书
县级文明单位申报材料
2014/05/23 职场文书
警察群众路线整改措施
2014/09/26 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android