Python发布订阅模式

2023-09-21 23:16:42


1、broadcast-service模块

Python发布订阅模式可以实现程序间的松耦合

broadcast-service是一个轻量级的Python发布订阅者框架,且支持同步、异步、多主题订阅等不同场景下的模式建立

通过broadcast-service,只需要引入一个单例类,就可以十分轻松地构建起一个发布订阅者模式,几乎没有代码侵入性

broadcast-service默认支持异步回调的方式,避免了线程阻塞的发生

主要特性:

  • 支持异步、同步、多主题订阅等不同的应用场景
  • 提供lambda、回调函数、装饰器等不同的语法编写模式
  • 支持同时订阅多个主题回调、同时向多个主题发布信息

安装:

pip install broadcast-service

2、基本使用

from broadcast_service import broadcast_service

# 1)发布
# 不带参数:publish(topics, msgs)
# 带参数:broadcast(topics, msgs, params)
def publish(topics, msgs, *args):
    if not args:
        broadcast_service.publish(topics, msgs)
    else:
        broadcast_service.broadcast(topics, msgs, args)
        
# 2)订阅
# subscribe(topics, callback) 或 listen(topics, callback)
def subscribe(topics, func):
    broadcast_service.subscribe(topics, func)
    # broadcast_service.listen(topics, func)

# 回调处理
def callback_handle(msgs):
    print(f"Received: {msgs}  正在处理...")

if __name__ == '__main__':
    # 订阅主题(监听)
    subscribe('topic1', callback_handle)
    # 发布主题(广播)
    publish(['topic1', 'topic2'], 'Message')
'''
Received: Message  正在处理...
'''

3、使用装饰器

# 订阅主题(监听)及回调处理
@broadcast_service.on_listen('topicX')
def callback_subscribe_handle(msgs):
    print(f"Received: {msgs}  正在处理...")

if __name__ == '__main__':
    # 发布主题(广播)
    publish(['topicX', 'topicY'], 'MessageX')
'''
Received: MessageX  正在处理...
'''

4、发布Topic带参数

# 订阅主题(监听)及回调处理
@broadcast_service.on_listen('topicP')
def callback_subscribe_handle(msgs, args):
    print(f"Params: {args}")
    print(f"Received: {msgs}  正在处理...")

if __name__ == '__main__':
    # 发布主题(广播)
    publish('topicP', 'MessageP', 'id', 'info')
'''
Params: ('id', 'info')
Received: MessageP  正在处理...
'''
更多推荐

HTML制作五子棋

上代码<html><head><metaname="viewport"content="width=device-width,initial-scale=0.7"><metacharset="utf-8"><title>源技五子棋</title><styletype="text/css">canvas{display:

JavaEE——网络编程(TCP流编程)

文章目录一、解释什么是TCP流套接字编程二、代码实现TCP流套接字创建客户端服务器1.实现回显服务器(1)服务器对客户端响应的问题分析解决(2)回显服务器代码整体罗列2.实现回显客户端(1)回显客户端整体代码罗列(2)对代码中整体存在的小问题分析三、总结与运行结果展示一、解释什么是TCP流套接字编程在上一篇文章中,我向

51单片机4【玩转开发板】

1.开发板完全介绍1.配件2.开发板主板及板载原件1.单片机(1)注意不要装反了,凹槽的一面向上是正的(2)不要再开电的时候取下或者装上。2.单片机工作必备的外围电路1.晶振2.复位电路3.电源供电电路4.USB下载电路3.其他的外围设备(1)数码管(2)插口(3)电池(4)独立按键矩阵按键3.上电前的准备工作1.检查

服务器为什么要一直开机?

很多人在选择服务器的时候会想要省钱,然后就想要自己搭建一个服务器,其实服务器呢是需要24小时一直开机的,一般服务器的工作时间是3-5年,它们第一次开机后就会一直到机器故障淘汰才会关机哦,这是为什么呢?今天就让小编来讲一讲吧。首先我们来讲一讲服务器本身,服务器是在网络中为PC端、智能手机登提供计算应用服务的,就像服务器如

Android的View绑定实现----编译时注解实现findViewById和setOnClickListener方式

标题有点长,相信用过xUtils和ButterKnife框架的都知道啥意思,他们都可以通过注解的方式省去繁琐的findViewById和setOnClickListener代码的编写。他们2者的实现原理不一样,前者用的是运行时注解,后者用的是编译时注解,对于不同的注解,会有不同的注解处理器,针对运行时注解会采用反射机制

Java高级-反射

目录认识反射、获取类反射(Reflection)反射可进行的操作加载类,获取类的字节码:Class对象获取对象的三种方法获取构造器对象并使用获取构造器的方法获取构造器的作用获取成员变量和方法对象并使用获取类的成员变量的方法获取类的成员变量的作用获取成员方法的方法获取成员方法的作用认识反射、获取类反射(Reflectio

JVM--Java类加载器笔记

Java类加载器代码经过编译变成了字节码打包成Jar文件。让JVM去加载需要的字节码,变成持久代/元数据区上的Class对象,接着执行程序逻辑。类声明周期和加载过程步骤:加载->链接(校验->准备->解析)->初始化->使用->卸载加载:根据明确知道的class完全限定名,来获取二进制classfile格式的字节流(找

算法讨论题 —— Java实现两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次。示例给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[0,1]解答这个题目的原题是在:力扣(Leet

Zookeeper分布式锁的概念及原理

文章目录1.Zookeeper分布式锁的概念2.分布式锁的实现方式3.Zookeeper分布式锁的原理1.Zookeeper分布式锁的概念分布式锁的概念图如下:一种演变过程。在我们进行单机应用程序开发时,往往会涉及到并发同步的问题,一般都会采用synchronized或者Lock锁的方式来解决多线程间的代码同步问题,这

EM3DANI包详解:使用Julia语言进行3D频域电磁数据建模的终极指南

第一部分:EM3DANI包的简介与安装1.EM3DANI包简介EM3DANI是一个强大的工具包,专门为那些希望使用Julia语言进行频域电磁(CSEM和MT)数据的3D建模的研究者和开发者设计。它支持各向同性和各向异性建模,使得用户可以更加灵活地进行电磁数据的模拟和分析。频域电磁(CSEM和MT)技术在地球物理勘探、矿

Leetcode.2826 将三个组排序

题目链接Leetcode.2826将三个组排序rating:1721题目描述给你一个下标从000开始长度为nnn的整数数组numsnumsnums。从000到n−1n-1n−1的数字被分为编号从111到333的三个组,数字iii属于组nums[i]nums[i]nums[i]。注意,有的组可能是空的。你可以执行以下操作

热文推荐