本文小编为大家详细介绍“python的blinker信号库怎么创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“python的blinker信号库怎么创建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一个基于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信号库怎么创建”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。