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制作爬虫采集小说
Oct 25 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python实现银行管理系统
Oct 25 Python
解决Python3下map函数的显示问题
Dec 04 Python
基于Python中random.sample()的替代方案
May 23 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
python文本处理的方案(结巴分词并去除符号)
May 26 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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中引用符号(&)的使用详解
2013/11/13 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP反射基础知识回顾
2020/09/10 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
jquery插件之easing使用
2010/08/19 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Apache如何部署django项目
2017/05/21 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python3字符串操作总结
2019/07/24 Python
为什么说python更适合树莓派编程
2020/07/20 Python
python如何实时获取tcpdump输出
2020/09/16 Python
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
消防器材管理制度
2014/01/28 职场文书
工程质量承诺书范文
2014/03/27 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang