Skip to main content

Lightweight thread-safe synchronous event bus for Python

Project description

EventBus

Лёгкая потокобезопасная шина событий (publish/subscribe) для Python.

Возможности

  • синхронная обработка событий;
  • потокобезопасность;
  • приоритеты обработчиков;
  • стабильный порядок вызова;
  • одноразовые подписки (once);
  • декораторы регистрации;
  • временные подписки через контекстный менеджер;
  • поддержка шаблонов * и **;
  • отмена события;
  • остановка распространения события;
  • слабые ссылки на методы и вызываемые объекты;
  • автоматическое удаление уничтоженных подписчиков;
  • кэширование маршрутизации событий;
  • генерация событий об ошибках;
  • строгий режим обработки исключений;
  • отсутствие внешних зависимостей.

Поддерживаемые версии Python:

  • Python 3.10+
  • Python 3.11
  • Python 3.12
  • Python 3.13

Установка

pip install eventbus

Быстрый старт

from eventbus import EventBus

bus = EventBus()


def handler(event):
    print(event.type)
    print(event.data)


bus.subscribe(
    "system/start",
    handler
)

bus.publish(
    "system/start",
    version="1.0"
)

Результат:

system/start
{'version': '1.0'}

Объект Event

Каждое событие представлено экземпляром класса Event.

event.type
event.data
event.source
event.timestamp
event.result
event.cancelled
event.propagation_stopped
event.exception

Подписка

bus.subscribe(
    "system/start",
    handler
)

Публикация

event = bus.publish(
    "system/start",
    value=123
)

Метод publish() возвращает объект Event.


Приоритеты

Обработчики вызываются в порядке возрастания приоритета.

bus.subscribe(
    "test",
    first_handler,
    priority=100
)

bus.subscribe(
    "test",
    second_handler,
    priority=200
)

Сначала будет вызван first_handler.


Стабильный порядок

Если приоритеты одинаковы, обработчики вызываются в порядке регистрации.

bus.subscribe("test", h1)
bus.subscribe("test", h2)
bus.subscribe("test", h3)

Порядок вызова:

h1
h2
h3

Одноразовые обработчики

bus.subscribe(
    "system/start",
    handler,
    once=True
)

После первого вызова обработчик будет автоматически удалён.


Декораторы

on()

@bus.on("system/start")
def on_start(event):
    print("started")

once()

@bus.once("system/start")
def initialize(event):
    print("called once")

Удаление подписки

bus.unsubscribe(
    "system/start",
    handler
)

Контекстный менеджер

with bus.subscription(
    "system/start",
    handler
):
    bus.publish("system/start")

# подписка автоматически удалена

Шаблоны

Точное совпадение

system/start

*

Один сегмент.

system/*

Подходит для:

system/start
system/stop

**

Любое количество сегментов.

system/**

Подходит для:

system
system/start
system/core/start
system/core/network/start

Отмена события

def handler(event):
    event.cancel("denied")

После вызова:

event.cancelled == True

Оставшиеся обработчики вызваны не будут.

Результат доступен через:

event.result

Остановка распространения

def handler(event):
    event.stop_propagation()

Оставшиеся обработчики не вызываются, однако событие не считается отменённым.

event.cancelled == False

Исключения

По умолчанию исключения внутри обработчиков не прерывают работу EventBus.

def handler(event):
    raise RuntimeError()

Исключение сохраняется:

event.exception

Также автоматически публикуется событие:

system/error/event

Строгий режим

bus = EventBus(strict=True)

В этом режиме исключение приводит к возбуждению:

EventDispatchError

Слабые ссылки

Методы объектов и вызываемые экземпляры хранятся через слабые ссылки.

Если объект уничтожен сборщиком мусора, подписка удаляется автоматически.

class Receiver:

    def on_event(self, event):
        pass


receiver = Receiver()

bus.subscribe(
    "test",
    receiver.on_event
)

Потокобезопасность

Все операции регистрации, удаления подписчиков и публикации событий являются потокобезопасными.

from threading import Thread

Один экземпляр EventBus может безопасно использоваться несколькими потоками одновременно.


Исключения библиотеки

EventBusError

Базовый класс всех исключений.

InvalidPatternError

Некорректный шаблон события.

InvalidHandlerError

Переданный объект не является вызываемым.

DuplicateSubscriptionError

Ошибка повторной регистрации.

EventDispatchError

Ошибка обработки события.


Тестирование

Проект покрыт тестами.

pytest

Лицензия

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

eventbus_lite-1.0.0.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

eventbus_lite-1.0.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file eventbus_lite-1.0.0.tar.gz.

File metadata

  • Download URL: eventbus_lite-1.0.0.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for eventbus_lite-1.0.0.tar.gz
Algorithm Hash digest
SHA256 5a6c9e4850d5f2c648b585534c996cb89b5906af61039d3a3fb87c49571117d2
MD5 f742edde6fc318ac6307356bd95af4b9
BLAKE2b-256 fd4297db6bae14eb6b885a10dc4f9397878b065e34fb93c7dddd9dca33c9523e

See more details on using hashes here.

File details

Details for the file eventbus_lite-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: eventbus_lite-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for eventbus_lite-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 705fbfa4fc8d78e3fbf7ef6a9f8dd7aa85a65042f5e73381379ae971fa64f988
MD5 d67024838ab833c2ef46461d8ea93cf9
BLAKE2b-256 dc4ae0883c12a10ae35080c7bc9c1309b936978525969b815f03ac74e3b1d98c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page