Пакеты PyPI
По состоянию на июнь 2020 года эти пакеты, связанные с событиями, доступны в PyPI и упорядочены по дате последнего выпуска.
Есть еще кое-что
Из множества библиотек можно выбирать, используя совершенно разную терминологию (события, сигналы, обработчики, диспетчеризация методов, перехватчики, ...).
Я пытаюсь держать обзор вышеупомянутых пакетов, плюс методы, упомянутые в ответах здесь.
Сначала немного терминологии ...
Образец наблюдателя
Самым основным стилем системы событий является «пакет методов обработки», который представляет собой простую реализацию шаблона Observer .
По сути, методы-обработчики (callables) хранятся в массиве и каждый из них вызывается, когда событие «срабатывает».
Опубликовать-Подписка
Недостаток систем событий Observer заключается в том, что вы можете зарегистрировать обработчики только для реального объекта Event (или списка обработчиков). Таким образом, на момент регистрации событие уже должно существовать.
Вот почему существует второй стиль систем событий:
шаблон публикации-подписки . Здесь обработчики регистрируются не в объекте события (или списке обработчиков), а в центральном диспетчере. Также уведомители общаются только с диспетчером. Что слушать или что публиковать, определяется «сигналом», который является не чем иным, как именем (строкой).
Образец медиатора
Может также представлять интерес: модель Посредника .
Крючки
Система «крючка» обычно используется в контексте плагинов приложения. Приложение содержит фиксированные точки интеграции (хуки), и каждый плагин может подключаться к этому хуку и выполнять определенные действия.
Другие «события»
Примечание: threading.Event не является «системой событий» в вышеприведенном смысле. Это система синхронизации потоков, в которой один поток ожидает, пока другой поток не «сигнализирует» объект Event.
Библиотеки сетевых сообщений также часто используют термин «события»; иногда они похожи по концепции; иногда нет. Конечно, они могут пересекать границы потоков, процессов и компьютеров. См. Например,
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Слабые ссылки
В Python хранение ссылки на метод или объект гарантирует, что он не будет удален сборщиком мусора. Это может быть желательно, но также может привести к утечкам памяти: связанные обработчики никогда не очищаются.
Некоторые системы событий используют слабые ссылки вместо обычных для решения этой проблемы.
Несколько слов о различных библиотеках
Системы событий в стиле наблюдателя:
- zope.event показывает, как это работает (см . ответ Леннарта ). Примечание: этот пример даже не поддерживает аргументы обработчика.
- Реализация LongPoke 'callable list' показывает, что такая система событий может быть реализована очень минималистично с помощью подклассов
list
.
- Вариант Felk EventHook также обеспечивает подписи вызывающих и вызывающих абонентов.
- EventHook от spassig (шаблон событий Майкла Фурда ) является простой реализацией.
- Класс Josip's Valued Lessons Event в основном тот же, но использует
set
вместо a list
для хранения сумки и реализует, __call__
которые являются разумными дополнениями.
- PyNotify похожа по своей концепции, а также предоставляет дополнительные понятия о переменных и условиях («событие изменения переменной»). Домашняя страница не работает.
- Axel - это, по сути, мешок с обработчиками, с большим количеством функций, связанных с многопоточностью, обработкой ошибок, ...
- Для python-dispatch требуются классы с четным исходным кодом
pydispatch.Dispatcher
.
- buslane основан на классах, поддерживает одно- или многократные обработчики и облегчает обширные подсказки типов.
- Pithikos ' Observer / Event - это легкий дизайн.
Библиотеки публикации-подписки:
- Blinker имеет несколько отличных функций, таких как автоматическое отключение и фильтрация по отправителю.
- PyPubSub является стабильным пакетом и обещает «расширенные функции, которые облегчают отладку и поддержку тем и сообщений».
- pymitter является портом Python Node.js EventEmitter2 и предлагает пространства имен, подстановочные знаки и TTL.
- PyDispatcher, кажется, подчеркивает гибкость в отношении публикации «многие ко многим» и т. Д. Поддерживает слабые ссылки.
- Луи является переработанным PyDispatcher и должен работать «в самых разных контекстах».
- pypydispatcher основан на (как вы уже догадались ...) PyDispatcher, а также работает в PyPy.
- django.dispatch - это переписанный PyDispatcher «с более ограниченным интерфейсом, но более высокой производительностью».
- pyeventdispatcher основан на диспетчере событий PHP-платформы Symfony.
- диспетчер был извлечен из django.dispatch, но становится довольно старым.
- EventManger Кристиана Гарсии - очень короткая реализация.
Другие:
- pluggy содержит систему хуков, которая используется
pytest
плагинами.
- RxPy3 реализует шаблон Observable и позволяет объединять события, повторять попытки и т. Д.
- Сигналы и слоты Qt доступны в PyQt
или PySide2 . Они работают как обратный вызов, когда используются в одном потоке, или как события (используя цикл событий) между двумя разными потоками. Сигналы и слоты имеют ограничение, что они работают только в объектах классов, которые являются производными
QObject
.