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 基础教程之包和类的用法
Feb 23 Python
Python文件的读写和异常代码示例
Oct 31 Python
python3 读写文件换行符的方法
Apr 09 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
python爬取微信公众号文章
Aug 31 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Django中F函数的使用示例代码详解
Jul 06 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
python中Mako库实例用法
Dec 31 Python
解决python 输出到csv 出现多空行的情况
Mar 24 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中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python变量不能以数字打头详解
2016/07/06 Python
python使用turtle库绘制时钟
2020/03/25 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
机电一体化职业规划书
2014/01/07 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
差生评语大全
2014/05/04 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
展览会邀请函
2015/02/02 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
如何使用SQL Server语句创建表
2022/04/12 SQL Server
Python使用pyecharts控件绘制图表
2022/06/05 Python