iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中的信号通信 blinker的使用小结
  • 175
分享到

python中的信号通信 blinker的使用小结

2024-04-02 19:04:59 175人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录信号:官方介绍:blinker 使用命名信号匿名信号组播信号接收方订阅主题装饰器用法可订阅主题的装饰器检查信号是否有接收者检查订阅者是否订阅了某个信号基于blinker的flas

信号:

信号是一种通知或者说通信的方式,信号分为发送方和接收方。发送方发送一中信号,接收方收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行。常见的linux中的信号,通过键盘输入Ctrl+C,就是发送给系统一个信号,告诉系统退出当前进程。

信号的特点就是发送端通知订阅者发生了什么。使用信号分为3步,定义信号,监听信号,发送信号

python中提供了信号概念的通信模块,就是blinker

官方介绍:

Blinker 是一个基于Python的强大的信号库,它既支持简单的点对点通信,也支持点对多点的组播。Flask的信号机制就是基于它建立的。Blinker的内核虽然小巧,但是功能却非常强大,它支持以下特性:

  • 支持注册全局命名信号
  • 支持匿名信号
  • 支持自定义命名信号
  • 支持与接收者之间的持久连接与短暂连接
  • 通过弱引用实现与接收者之间的自动断开连接
  • 支持发送任意大小的数据
  • 支持收集信号接收者的返回值
  • 线程安全

blinker 使用

安装方法:

pip install blinker

命名信号


from blinker import signal

# 定义一个信号
s = signal('king')


def animal(args):
    print('我是小钻风,大王回来了,我要去巡山')

# 信号注册一个接收者
s.connect(animal)

if "__main__" == __name__:
    # 发送信号
    s.send()

匿名信号

blinker也支持匿名信号,就是不需要指定一个具体的信号值。创建的每一个匿名信号都是互相独立的。


from blinker import Signal

s = Signal()

def animal(sender):
    print('我是小钻风,大王回来了,我要去巡山')

s.connect(animal)

if "__main__" == __name__:
    s.send()

组播信号

组播信号是比较能体现出信号优点的特征。多个接收者注册到信号上,发送者只需要发送一次就能传递信息到多个接收者。


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('大王叫我来巡山,抓个和尚做晚餐!')

接收方订阅主题

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


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)

装饰器用法

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


from blinker import signal

s = signal('king')

@s.connect
def animal_one(args):
    print(f'我是小钻风,今天的口号是: {args}')

@s.connect
def animal_two(args):
    print(f'我是大钻风,今天的口号是: {args}')

if "__main__" == __name__:
    s.send('大王叫我来巡山,抓个和尚做晚餐!')

可订阅主题的装饰器

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


from blinker import signal

s = signal('king')

@s.connect_via('大象')
def animal(args):
    print(f'我是小钻风,{args} 是我大哥')


if "__main__" == __name__:
    for i in ['狮子', '大象', '大鹏']:
        s.send(i)

检查信号是否有接收者

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


from blinker import signal

s = 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
    print(res)
    if res:
        q.send()
    else:
        print("孩儿们都出去巡山了")

{4511880240: <weakref at 0x10d02ae80; to 'function' at 0x10cedd430 (animal)>}
我是小钻风,大王回来了,我要去巡山
{}
孩儿们都出去巡山了

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

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


from blinker import signal

s = 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)
    print(res)

True
False

基于blinker的Flask信号

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

简单 Flask demo


from flask import Flask

app = 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

自定义信号

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


from flask.signals import _signals

from flask import Flask
from 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()

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 Flask
from flask.signals import _signals, request_started
import 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的文章就介绍到这了,更多相关python信号blinker内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中的信号通信 blinker的使用小结

本文链接: https://www.lsjlt.com/news/155123.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中的信号通信 blinker的使用小结
    目录信号:官方介绍:blinker 使用命名信号匿名信号组播信号接收方订阅主题装饰器用法可订阅主题的装饰器检查信号是否有接收者检查订阅者是否订阅了某个信号基于blinker的Flas...
    99+
    2024-04-02
  • python的blinker信号库怎么创建
    本文小编为大家详细介绍“python的blinker信号库怎么创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“python的blinker信号库怎么创建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、安装一...
    99+
    2023-06-30
  • Python强大的信号库blinker入门详细教程
    目录1、信号2、blinker 使用2.1 命名信号2.2 匿名信号2.3 组播信号2.4 接收方订阅主题2.5 装饰器用法2.6 可订阅主题的装饰器2.7 检查信号是否有接收者2....
    99+
    2024-04-02
  • 【Linux从入门到精通】信号(信号保存 & 信号的处理)
      本篇文章接着信号(初识信号 & 信号的产生)进行讲解。学完信号的产生后,我们也了解了信号的一些结论。同时还留下了很多疑问: 上篇文章所说的所有信号产生,最终都要有OS来进行执行,为什么呢?OS是进程的管理者。信号的处理是否是立即...
    99+
    2023-09-29
    运维 linux 信号处理
  • 如何使用Python中的进程间通信
    如何使用Python中的进程间通信进程间通信(IPC,Inter-Process Communication)是计算机科学中一个重要的概念,它允许不同的进程在同一个计算机系统中进行数据交换和共享资源。在Python中,有多种方式可以实现进程...
    99+
    2023-10-22
    Python 进程通信 IPC
  • Python的blinker库怎么使用
    本篇内容主要讲解“Python的blinker库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的blinker库怎么使用”吧!1、信号信号是一种通知或者说通信的方式,信号分为...
    99+
    2023-06-29
  • 微信小程序-web-View使用以及跟小程序的通信传值
    一、web-view是什么? 简单来说 就是小程序嵌套H5页面 web-view 官网地址 二、如何使用web-view 1.在小程序创建一个页面,专门用来显示H5 不需要在这个页面做修饰,H5页面会自动铺满 bindmessage属性用来...
    99+
    2023-08-16
    前端 微信小程序 小程序
  • python中的Queue怎么通信
    这篇文章主要介绍了python中的Queue怎么通信的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中的Queue怎么通信文章都会有所收获,下面我们一起来看看吧。说明Queue可以使用multipro...
    99+
    2023-06-30
  • JavaAQS信号量Semaphore的使用
    目录一.什么是Semaphore二.Semaphore的使用三.Semaphore源码分析一.什么是Semaphore Semaphore,俗称信号量,它是操作系统中PV操作的原语在...
    99+
    2023-02-02
    Java信号量Semaphore Java Semaphore Java信号量
  • Python中星号的五种用法小结
    目录1. 引言2. 乘法和幂运算符3. 函数接收数量不固定的入参4. 限制函数入参仅以关键字形式输入5. 可迭代对象解包操作6. 扩展可迭代对象解包7. 结论1. 引言 星号* 往往...
    99+
    2023-02-28
    Python 星号
  • 微信小程序如何使用websocket通讯的demo
    这篇文章主要为大家展示了“微信小程序如何使用websocket通讯的demo”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何使用websocket通...
    99+
    2024-04-02
  • Qt实现两个独立窗口的信号通信
    本文实例为大家分享了Qt实现两个独立窗口的信号通信的具体代码,供大家参考,具体内容如下 知识点 Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定...
    99+
    2024-04-02
  • Python的串口通信(pyserial
    串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。pyserial...
    99+
    2023-01-31
    串口 通信 Python
  • python中对信号的处理详解
    目录什么是信号Python的信号处理Python对信号的处理信号枚举信号函数signal.alarm(time)signal.pause()signal.setitimer(whic...
    99+
    2024-04-02
  • Socket的通信原理和使用
     目录 一、什么是 Socket? 二、Socket 通信过程         2.1 通信过程介绍        2.2 实现TCP建立连接的三次握手过程  三、 使用Socket进行通信【php】         3.1 PHP中So...
    99+
    2023-09-06
    网络 php
  • WebSocket的通信原理和使用
    一、什么是WebSocket? 1.1 简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即允许服务器主动发送信息给客户端。因此,在WebSocket中,浏览器和服务器只...
    99+
    2023-09-13
    websocket php
  • Qt中的TCP通信
    一、TCP的特点 TCP(传输控制协议)是一种面向连接的,可靠的,基于字节流的传输层通信协议 二、TCP适合应用的场景 TCP协议适用于要求可靠传输的应用,例如文件传输,网络数据库,分布式高精度计算系统的数据传输。 三、Qt中使用TCP通信...
    99+
    2023-09-04
    tcp/ip 网络 服务器
  • 如何使用Python中的socket编程进行数据通信
    标题:Python中的socket编程及代码示例引言:在现代互联网时代,数据通信无处不在。而Python中的socket编程提供了一种简单而有效的方式来实现网络上的数据传输。本文将介绍如何使用Python的socket模块来进行数据通信,并...
    99+
    2023-10-22
    Python Socket编程 数据通信
  • 使用python实现UDP通信方式
    目录python UDP通信对UDP协议的理解Socket简介UDP特点UDP中客户端和服务器端交互 UDP网络通信过程 多线程聊天室服务器端的实现UDP中广播p...
    99+
    2024-04-02
  • swoole中信号量怎么使用
    这篇文章主要介绍了swoole中信号量怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇swoole中信号量怎么使用文章都会有所收获,下面我们一起来看看吧。在swoole中,信号量主要用来保护共享资源,使得...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作