Python是否内置发布者/订阅者(publisher/consumer)模式?
Python 内置发布/订阅模式的实现方案
Python标准库并没有直接提供你示例中那种开箱即用的publish/consume装饰器式发布订阅机制,但用标准库的基础工具就能快速实现一套轻量、符合你需求的版本。
轻量实现示例
1. 核心事件总线模块(event_bus.py)
# 存储事件与对应订阅回调的映射 _subscribers = {} def publish(event_name, *args, **kwargs): """发布事件,触发所有对应订阅的回调""" for callback in _subscribers.get(event_name, []): callback(*args, **kwargs) def consume(event_name): """装饰器:注册函数为指定事件的订阅者""" def decorator(callback): if event_name not in _subscribers: _subscribers[event_name] = [] _subscribers[event_name].append(callback) return callback return decorator
2. 业务代码中使用
db/user.py
from event_bus import publish def create(**kwargs): user = db.put('User', **kwargs) publish('user.created', user)
admin/listeners.py
from event_bus import consume # 假设send_admin_mail是你已实现的邮件发送函数 from your_mail_module import send_admin_mail @consume('user.created') def send_email_on_signup(user): send_admin_mail(f'New user signup {user.name}')
关键注意事项
- 订阅生效时机:要确保订阅者模块(比如
admin/listeners.py)在发布事件前被导入,否则回调不会被注册到事件总线中。可以在项目启动入口统一导入所有订阅模块。 - 同步/异步支持:上述实现是同步阻塞的,如果需要异步处理事件,可以结合
asyncio修改publish函数,适配异步回调(比如用asyncio.gather批量执行异步函数)。 - 扩展特性:如果需要事件过滤、回调优先级、取消订阅等功能,可以在这个基础版本上扩展,比如给订阅者添加优先级参数,或者提供
unsubscribe函数移除回调。
内容的提问来源于stack exchange,提问作者Mojimi
相关产品推荐
相关产品推荐

