python 教程之blinker 信号库
作者:autofelix 发布时间:2023-11-23 10:15:51
标签: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)
来源:https://blog.51cto.com/autofelix/5260719


猜你喜欢
- 最近使用vscode进行前端编程,遇到一些问题网上说明的不是很明显,故记录一下 1.开vscode使用CTRL+`或者点击查看到集成终端打开
- 选项default-charaset-set=utf8;然后创建一个数据表 create table a_table(b varchar(2
- 第一种方式阿里云、百度云服务器可用!!!yum install python3第二种方式1.下载python3.6.5的压缩包wget ht
- 介绍毫无疑问,任何一个试图使用 CSS 的网页设计师和开发人员都会发现不同的浏览器要求不同的样式声明。这些烦恼归咎于各浏览器及其各版本不同程
- Python2 和 Python3 是不兼容的,如果碰到无法升级到 Python2 代码,或者同事中有坚守 Python2 阵营的情况,就要
- 利用pymongo包进行数据库的连接,使用xlrd包读取excel数据,由于二者数据结构的不同,要将excel格式数据转换为json格式数据
- 得益于 Python 的自动垃圾回收机制,在 Python 中创建对象时无须手动释放。这对开发者非常
- 本文实例讲述了Python使用sklearn实现的各种回归算法。分享给大家供大家参考,具体如下:使用sklearn做各种回归基本回归:线性、
- 问题是:输入一个数字,按照指定要求逆序输出该数字,很简单,下面是实现:#!usr/bin/env python#encoding:utf-8
- 前言前几天写了一篇MySQL高并发生成唯一订单号的方法,有人私信问有没有SQL server版本的,今天中午特地写了SQL server版本
- 前几天同学要我帮他做个国际聊天室,要求能够将聊天的内容自动翻译成多国语言.本来想用worldlink的翻译服务,但是用ajax很难获得结果,
- 以下的文章主要是介绍SQL Server数据转换服务的4妙用之执行一些自动化的操作。在SQL Server数据库的实际操作管理中,数据库管理
- 0. 学习目标单链表只有一个指向直接后继的指针来表示结点间的逻辑关系,因此可以方便的从任一结点开始查找其后继结点,但要找前驱结点则比较困难,
- 作用:export和export default实现的功能相同,即:可用于导出(暴露)常量、函数、文件、模块等,以便其他文件调用。区别:1、
- 在上一讲代码的基础上,做进一步修改,成为了如下程序,请看官研习这个程序:#!/usr/bin/env python#coding:utf-8
- 本文实例讲述了jQuery实现的简单分页。分享给大家供大家参考,具体如下:<!DOCTYPE html PUBLIC "-/
- argparse介绍 argparse包用于解释命令行参数。这里给出几个常用的方法。# 创建解析器对象# @para: descripti
- python的annotate函数annotate函数该函数的详细参数可调用内置属性__doc__查看。import matplotlib.
- 1、Python 条件语句Python 条件语句是通过一条或多条语句的执行结果来决定执行的代码块。Python 编程中 if 语句用于控制程
- PDOStatement::columnCountPDOStatement::columnCount — 返回结果集中的列数。(PHP 5