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使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
pytorch实现MNIST手写体识别
Feb 14 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
python def 定义函数,调用函数方式
Jun 02 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python 如何实现访问者模式
Jul 28 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 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/03/04 欧美动漫
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php中static和const关键字用法分析
2016/12/07 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python 异常处理的实例详解
2017/09/11 Python
深入理解Django的中间件middleware
2018/03/14 Python
python Django的web开发实例(入门)
2019/07/31 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
羽毛球社团活动总结
2014/06/27 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang