1、信号
信号是一种通知或者说通信的方式,信号分为发送方和接收方。发送方发送一种信号,接收方收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行。
常见的 Linux 中的信号,通过键盘输入 Ctrl+C,就是发送给系统一个信号,告诉系统退出当前进程。
信号的特点就是发送端通知订阅者发生了什么。使用信号分为 3 步:定义信号,监听信号,发送信号。
Python 中提供了信号概念的通信模块,就是blinker。
Blinker 是一个基于 Python 的强大的信号库,它既支持简单的点对点通信,也支持点对多点的组播。Flask 的信号机制就是基于它建立的。Blinker 的内核虽然小巧,但是功能却非常强大,它支持以下特性:
- 支持注册全局命名信号
- 支持匿名信号
- 支持自定义命名信号
- 支持与接收者之间的持久连接与短暂连接
- 通过弱引用实现与接收者之间的自动断开连接
- 支持发送任意大小的数据
- 支持收集信号接收者的返回值
- 线程安全
2、blinker 使用
安装方法:
pip install blinker
2.1 命名信号
from blinker import signal
# 定义一个信号
s = signal('king')
def animal(args):
print('我是小钻风,大王回来了,我要去巡山')
# 信号注册一个接收者
s.connect(animal)
if "__main__" == __name__:
# 发送信号
s.send()
2.2 匿名信号
blinker 也支持匿名信号,就是不需要指定一个具体的信号值。创建的每一个匿名信号都是互相独立的。
from blinker import Signal
s = Signal()
def animal(sender):
print('我是小钻风,大王回来了,我要去巡山')
s.connect(animal)
if "__main__" == __name__:
s.send()
2.3 组播信号
组播信号是比较能体现出信号优点的特征。多个接收者注册到信号上,发送者只需要发送一次就能传递信息到多个接收者。
from blinker import signa