Создание шины событий с механизмом подписки

Event описывает событие, Handler обрабатывает его, Bus хранит подписки и маршрутизирует публикации. Сначала определите синхронность, порядок и политику ошибок.

Короткий ответ

Что ответить на собеседовании

Event описывает событие, Handler обрабатывает его, Bus хранит подписки и маршрутизирует публикации. Сначала определите синхронность, порядок и политику ошибок.

Подробный разбор

Ответ с пояснениями

Условие

Задача: построить систему обмена событиями между компонентами через шину.

  1. Сформулировать требования и выделить основные сущности/участники.
  2. Определить набор интерфейсов (например, Event, Handler, Bus).
  3. Спроектировать логику взаимодействия: как публикуются события, как происходит подписка и как вызываются обработчики.

Ответ

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. В этом варианте вызываются обработчики точного типа в порядке подписки, а исключение останавливает публикацию. Повторные подписки разрешены. Потокобезопасность, наследование типов и асинхронность требуют отдельного контракта; надёжная межпроцессная доставка — уже задача брокера и подтверждений.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее