Event описывает событие, Handler обрабатывает его, Bus хранит подписки и маршрутизирует публикации. Сначала определите синхронность, порядок и политику ошибок.
Создание шины событий с механизмом подписки
Event описывает событие, Handler обрабатывает его, Bus хранит подписки и маршрутизирует публикации. Сначала определите синхронность, порядок и политику ошибок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача: построить систему обмена событиями между компонентами через шину.
- Сформулировать требования и выделить основные сущности/участники.
- Определить набор интерфейсов (например, Event, Handler, Bus).
- Спроектировать логику взаимодействия: как публикуются события, как происходит подписка и как вызываются обработчики.
Ответ
Event описывает событие, Handler обрабатывает его, Bus хранит подписки и маршрутизирует публикации. Сначала определите синхронность, порядок и политику ошибок.
Минимальная внутрипроцессная синхронная шина:
from collections import defaultdict
class Bus:
def __init__(self):
self.handlers = defaultdict(list)
def subscribe(self, event_type, handler):
self.handlers[event_type].append(handler)
def unsubscribe(self, event_type, handler):
self.handlers[event_type].remove(handler)
def publish(self, event):
for handler in tuple(self.handlers[type(event)]):
handler(event)
Снимок подписчиков защищает текущий обход от изменения списка внутри callback. В этом варианте вызываются обработчики точного типа в порядке подписки, а исключение останавливает публикацию. Повторные подписки разрешены. Потокобезопасность, наследование типов и асинхронность требуют отдельного контракта; надёжная межпроцессная доставка — уже задача брокера и подтверждений.