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 爬虫模拟登陆知乎
Sep 23 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
python Web开发你要理解的WSGI & uwsgi详解
Aug 01 Python
Numpy之文件存取的示例代码
Aug 03 Python
Python3中的bytes和str类型详解
May 02 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
python中return不返回值的问题解析
Jul 22 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(1)
2006/10/09 PHP
PHP 高手之路(一)
2006/10/09 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
python的exec、eval使用分析
2017/12/11 Python
python字典改变value值方法总结
2019/06/21 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
python爬取youtube视频的示例代码
2021/03/03 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
农民工讨薪标语
2014/06/26 职场文书
2014年减负工作总结
2014/12/10 职场文书
任命书怎么写
2015/03/02 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
利用python做表格数据处理
2021/04/13 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android