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 02 Python
Python中decorator使用实例
Apr 14 Python
Python中super函数的用法
Nov 17 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python SQLite3简介
Feb 22 Python
Windows下python3.7安装教程
Jul 31 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python实现感知器算法(批处理)
Jan 18 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
python中sort和sorted排序的实例方法
Aug 26 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
python 爬取华为应用市场评论
May 29 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
php接口和抽象类使用示例详解
2014/03/02 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php文件缓存类汇总
2014/11/21 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
js跑马灯代码(自写)
2013/04/17 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
python魔法方法-自定义序列详解
2016/07/21 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Django实现跨域请求过程详解
2019/07/25 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
软件设计的目标是什么
2016/12/04 面试题
中专生自我鉴定范文
2014/02/02 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
Python 如何解决稀疏矩阵运算
2021/05/26 Python