You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:52:09