千家信息网

Python的blinker库怎么使用

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本篇内容主要讲解"Python的blinker库怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python的blinker库怎么使用"吧!1、信号
千家信息网最后更新 2024年11月11日Python的blinker库怎么使用

本篇内容主要讲解"Python的blinker库怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python的blinker库怎么使用"吧!

    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 signal s = signal('king')def animal_one(args):    print(f'我是小钻风,今天的口号是: {args}')def animal_two(args):    print(f'我是大钻风,今天的口号是: {args}')s.connect(animal_one)s.connect(animal_two)if "__main__" == __name__:    s.send('大王叫我来巡山,抓个和尚做晚餐!')

    2.4 接收方订阅主题

    接受方支持订阅指定的主题,只有当指定的主题发送消息时才发送给接收方。这种方法很好的区分了不同的主题。

    from blinker import signal s = signal('king')def animal(args):    print(f'我是小钻风,{args} 是我大哥')s.connect(animal, sender='大象')if "__main__" == __name__:    for i in ['狮子', '大象', '大鹏']:        s.send(i)

    2.5 装饰器用法

    除了可以函数注册之外还有更简单的信号注册方法,那就是装饰器。

    from blinker import signal s = signal('king')@s.connectdef animal_one(args):    print(f'我是小钻风,今天的口号是: {args}')def animal_two(args):    print(f'我是大钻风,今天的口号是: {args}')if "__main__" == __name__:    s.send('大王叫我来巡山,抓个和尚做晚餐!')

    2.6 可订阅主题的装饰器

    connect的注册方法用着装饰器时有一个弊端就是不能够订阅主题,所以有更高级的connect_via方法支持订阅主题。

    from blinker import signals = signal('king')@s.connect_via('大象')def animal(args):    print(f'我是小钻风,{args} 是我大哥')if "__main__" == __name__:    for i in ['狮子', '大象', '大鹏']:        s.send(i)

    2.7 检查信号是否有接收者

    如果对于一个发送者发送消息前要准备的耗时很长,为了避免没有接收者导致浪费性能的情况,所以可以先检查某一个信号是否有接收者,在确定有接收者的情况下才发送,做到精确。

    from blinker import signals = signal('king')q = signal('queue')def animal(sender):    print('我是小钻风,大王回来了,我要去巡山')s.connect(animal)if "__main__" == __name__:        res = s.receivers    print(res)    if res:        s.send()    res = q.receivers        q.send()    else:        print("孩儿们都出去巡山了")

    {4511880240: }
    我是小钻风,大王回来了,我要去巡山
    {}
    孩儿们都出去巡山了

    2.8 检查订阅者是否订阅了某个信号

    也可以检查订阅者是否由某一个信号

    from blinker import signals = signal('king')q = signal('queue')def animal(sender):    print('我是小钻风,大王回来了,我要去巡山')s.connect(animal)if "__main__" == __name__:        res = s.has_receivers_for(animal)    print(res)    res = q.has_receivers_for(animal)

    True
    False

    3、基于 blinker 的 Flask 信号

    Flask 集成 blinker 作为解耦应用的解决方案。在 Flask 中,信号的使用场景如:请求到来之前,请求结束之后。同时 Flask 也支持自定义信号。

    3.1 简单 Flask demo

    from flask import Flaskapp = Flask(__name__)@app.route('/',methods=['GET','POST'],endpoint='index')def index():    return 'hello blinker' if __name__ == '__main__':    app.run()

    访问127.0.0.1:5000时,返回给浏览器hello blinker。

    3.2 自定义信号

    因为 Flask 集成了信号,所以在 Flask 中使用信号时从 Flask 中引入。

    from flask import Flaskfrom flask.signals import _signals app = Flask(__name__)s = _signals.singal('msg')def QQ(args):    print('you have msg from QQ')s.connect(QQ)@app.route('/',methods=['GET','POST'],endpoint='index')def index():    s.send()    return 'hello blinker'if __name__ == '__main__':    app.run()

    3.3 Flask自带信号

    在 Flask 中除了可以自定义信号,还可以使用自带信号。Flask 中自带的信号有很多种,具体如下:

    请求request_started = _signals.signal('request-started')                # 请求到来前执行request_finished = _signals.signal('request-finished')              # 请求结束后执行 模板渲染before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行请求执行got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)appcontext_tearing_down = _signals.signal('appcontext-tearing-down') # 请求上下文执行完毕后自动执行(无论成功与否)请求上下文中appcontext_pushed = _signals.signal('appcontext-pushed')            # 请求上下文push时执行appcontext_popped = _signals.signal('appcontext-popped')            # 请求上下文pop时执行message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触

    下面以请求到来之前为例,看 Flask 中信号如何使用

    from flask import Flaskfrom flask.signals import _signals, request_startedimport time app = Flask(__name__)def wechat(args):    print('you have msg from wechat')# 从flask中引入已经定好的信号,注册一个函数request_started.connect(wechat)@app.route('/',methods=['GET','POST'],endpoint='index')def index():    return 'hello blinker'if __name__ == '__main__':    app.run()

    当请求到来时,Flask 会经过request_started 通知接受方,就是函数wechat,这时wechat函数先执行,然后才返回结果给浏览器。

    但这种使用方法并不是很地道,因为信号并不支持异步方法,所以通常在生产环境中信号的接收者都是配置异步执行的框架,如 Python 中大名鼎鼎的异步框架 celery。

    到此,相信大家对"Python的blinker库怎么使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    信号 支持 接收者 小钻 订阅 就是 方法 主题 大王 函数 我要 上下 上下文 口号 大象 收方 模板 订阅者 检查 通信 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 麒麟服务器系统修改密码 数据库copy的用法 s版服务器和普通系统的区别 lol韩服ob服务器崩溃 近3年金融网络安全事件 湖北网络安全技术提升网络安全 桌面云是云服务器吗 宣传网络安全的社会经济效应 js服务器 南网云商招聘信息安全网络安全 文献检索报告计算机网络技术 乐山软件开发就看青岗科技 下列数据库属于多租户数据库的是 局域网数据库系统管理 软件开发与项目管理专科大学 江苏工业点胶软件开发 建飞网络安全吗 互联网金融科技行业发展前景 互联网平台的名字科技风 公司网络安全证书 数据库建表外键关键字 12306订票服务器什么样 为什么淘宝助理连不上服务器 计算机网络技术三级有用吗 金融网络安全口号标语 安卓游戏服务器下载软件 乐山软件开发就看青岗科技 软件开发劳动协议转外包协议 dell全球服务器排名 t3单位名称数据库
    0