from collections import defaultdict
from threading import Lock
"""
python 版本事件总线
"""
class PyBus:
def __init__(self):
self.subscriptions = defaultdict(dict)
self.lock = Lock()
def clear(self):
with self.lock:
self.subscriptions.clear()
def subscribe(self, subject, owner, func):
with self.lock:
self.subscriptions[subject][owner] = func
def unsubscribe(self, subject, owner):
with self.lock:
if subject in self.subscriptions and owner in self.subscriptions[subject]:
del self.subscriptions[subject][owner]
if not self.subscriptions[subject]:
del self.subscriptions[subject]
def has_subscription(self, subject, owner):
with self.lock:
return owner in self.subscriptions.get(subject, {})
def publish(self, subject, *args, **kwargs):
with self.lock:
subscribers = list(self.subscriptions.get(subject, {}).items())
for owner, func in subscribers:
try:
func(*args, **kwargs)
except Exception as e:
print(f"Error handling {subject} for {owner}: {e}")
# Singleton pattern for PyBus
class BusSingleton(PyBus):
pass
pybus = BusSingleton()
具体使用
订阅
pybus.subscribe('restart_event', self.on_restart)
给订阅者发送消息
pybus.publish('restart_event', 'i am going to restart')
清除所有订阅者
pybus.clear()