首页 > 其他分享 >blinker信号的使用

blinker信号的使用

时间:2024-12-25 17:26:08浏览次数:6  
标签:blinker sender signal send 发送者 信号 使用 print

文章目录


简介

blinker 是一个轻量级的 Python 库,用于实现信号(Signals)机制,帮助开发者在应用程序中解耦不同的组件。它允许一部分代码发送信号,而其他部分可以监听这些信号并作出响应,从而实现了事件驱动的编程模式。flask中也是使用了这个库实现了一些常用信号例如appcontext_popped当上下文被弹出时发送信号给接收者。


一、创建命名空间

如果没有安装请使用pip install blinker
其实这就是一个包装后的字典。
代码如下

from blinker import Namespace
# 创建命名空间
my_signals = Namespace()

二、基本使用

创建信号

使用Namespace中的signal函数可以创建一个信号( NamedSignal对象)
代码如下

new_signal = my_signals.signal('新建信号', doc='这是新建信号的说明')

这个源代码并不复杂,查看后可以发现,是创建一个NameSignal对象并将其绑定到当前对象上,前面有说Namespace是一个扩展了过后的字典对象。
在这里插入图片描述

订阅信号

订阅信号有2种方式,直接订阅和装饰器

首先是第一种:直接订阅

代码如下

#定义一个接收者函数,第一个参数必须是信号的发送者给的信息(后面会讲), 后面就是可选参数,可以自己灵活配置。
def receiver(sender, **kwargs):
    print("接收到信号:")
    print(f"发送者的消息:{sender}")
    print(f"发送过来的参数是{kwargs}")
func = new_signal.connect(receiver)#它会返回receiver本身。它里面其实就是用了receiver的id做了唯一标识符。

然后就是第二种:装饰器

from blinker import ANY#这个表示接收者会在任何发送者发出信号时被调用
@new_signal.connect_via(ANY)
def receiverV2(sender, **kwargs):
    print("*"*50)
    print("接收到信号:")
    print(f"发送者的消息:{sender}")
    print(f"发送过来的参数是{kwargs}")
    print("\n\n\n")

其实内部也是调用了connect

发送信号

使用send方法即可完成发送
代码如下

receiver_s = new_signal.send("发送者", arg1='参数1', arg2='参数2')
print(receiver_s)

运行结果如下
在这里插入图片描述
send返回一个列表,其元素是一个二元组,其第一个元素是接收者本身,第二个元素是接收者被调用时返回的参数。

三、提高

前面有讲到订阅的时候有sender参数,默认时ANY表示任何发送者发出信号时都会被调用。其实这个就像是一个key只有当send时给出指定的key时才会触发相应的订阅者。
给个示例

def receiverV3(sender, **kwargs):
    print("="*50)
    print("接收到信号:")
    print(f"发送者的消息:{sender}")
    print(f"发送过来的参数是{kwargs}")
    print("="*50)
new_signal.connect(receiverV3, sender="V3")#这里给个字符串V3当它的键
new_signal.send()

运行结果如下:
在这里插入图片描述

new_signal.send(sender="V3")

运行结果如下
在这里插入图片描述
可以看到只有当send时的sender参数是订阅时的sender参数时,订阅者函数才会调用。

总结

本文介绍blinker的基本用法,并通过实例介绍了如何使用信号和槽函数。

槽函数(Slot Function)是信号与接收器(或称为侦听器)间的一种工作机制,特别是在事件驱动编程中广泛使用。槽函数是一个特定的可调用对象(如函数或方法),它被连接到事件源(如信号)上,当事件发生时,槽函数会被自动调用以响应这个事件。

标签:blinker,sender,signal,send,发送者,信号,使用,print
From: https://blog.csdn.net/2301_79920669/article/details/144722456

相关文章

  • centos环境下使用docker部署.net8
    创建项目创建.net8版本的webapi项目创建dockerfile有两种创建dockerfile文件的方式,一是创建项目的时候勾选“启用容器支持”,如图1所示,二是在解决方案资源管理器中鼠标右键项目,选择“添加”,再点击“Docker支持”,在弹出的弹框中进行选择,如图2所示。图1图2:dockerfile......
  • 实战:Go语言项目之使用JWT实现用户认证
    实战:Go语言项目之使用JWT实现用户认证基于cookie-Session和基于token的认证模式需求:请求分类用户认证HTTP是一个无状态的协议,一次请求结束后,下次再发送,服务器就不知道这个请求是谁发过来的(同一个IP不代表同一个用户),在Web应用中,用户的认证和鉴权是非常重要的一环,实践中有......
  • 无人设备遥控器之信号放大器篇
    一、工作原理   信号放大器的工作原理是将遥控器发出的信号从输入端输入,经过一系列的电路元件进行放大、滤波和调制等处理,最后输出至无人设备的天线,以实现信号的增强和远距离传输。这些电路元件通常包括电容、电阻、运算放大器、电感、变压器和可变电容等。二、主要作用......
  • 遇到Wi-Fi故障怎么办?信号问题、干扰问题要着重看!
    Wi-Fi网络已成为我们日常生活和工作中不可或缺的一部分,无论是家庭用户还是企业工作环境,稳定而高速的无线网络都至关重要。然而,随着设备数量的增加、环境因素的变化以及技术的不断发展,Wi-Fi网络不可避免地会遇到种种问题。无论是网络缓慢、连接不稳定还是干扰严重,Wi-Fi故障排......
  • shell jq使用记录
    linuxjq处理字典内的数组字典数组catdata.json{"fruits":["apple","banana","cherry"]}#获取字典keysjq'keys'data.json["fruits"]#获取获取字典中数组keysjq'.fruits|keys'data.json......
  • mysql 127.0.0.1连接正常,使用ip无法连接
    mysql127.0.0.1连接正常,使用ip无法连接1.使用127.0.0.1连接mysqlmysql-uroot-p-h127.0.0.12.使用ip连接mysql#查看当前虚机的ip地址ipa#使用ip地址连接mysqlmysql-uroot-p-h192.168.91.133错误信息:ERROR1130(HY000):Host'192.168.91.133'isnotal......
  • 如何在 Ubuntu 22.04 上安装和使用 Composer
    简介如果你是一名PHP开发者,想要简化你的项目依赖管理,那么Composer是一个必不可少的工具。Composer可以简化包管理,并允许你轻松地将外部库集成到你的项目中。本教程将向你展示如何在Ubuntu22.04操作系统上安装Composer,并允许你充分利用其强大的功能。首先,让我们了......
  • 充电桩老化负载如何正确使用和操作?
    充电桩老化负载的正确使用和操作是确保充电安全和设备寿命的重要环节,以下是一些建议:定期检查:定期对充电桩进行视觉检查,查看是否有损坏、腐蚀或松动的部件。特别注意电缆和插头,因为这些都是容易老化的部分。避免过载:不要将充电桩用于超过其设计容量的设备。过载可能导致设备过热......
  • 在Asp.netCore中使用Attribute来描述限流
    前言同事问我Asp.netCore的RateLimiting是怎么使用的,我回答说很简单的,你只要按照如下步骤来:在RateLimiterOptions上注册policy,记住policy对应的policyName在Web应用添加UseRateLimiter()中间件在api对应的Action上标注[EnableRateLimiting(policyName)]半小时后,同事说要对......
  • Protocol Buffers 使用笔记
    ProtocolBuffers使用笔记created:2024-03-04T11:11+08:00modified:2024-11-26T15:28+08:00published:2024-12-25T15:30+08:00categories:applicationsProtocolBuffers简称protobuf或者PB,要解决的问题是这样的:在互联网上传输大量数据,如果使用json等类似格式,会......