Пакети PyPI
Станом на червень 2020 року, це пакети, пов’язані з подіями, доступні на PyPI, упорядковані до останньої дати випуску.
Є ще більше
Це багато бібліотек для вибору, використовуючи дуже різну термінологію (події, сигнали, обробники, відправлення методів, гачки, ...).
Я намагаюся зберегти огляд вищевказаних пакетів, а також методи, згадані у відповідях тут.
По-перше, деяка термінологія ...
Шаблон спостерігача
Найбільш базовий стиль системи подій - це «мішок методів обробника», який є простою реалізацією шаблону спостерігача .
В основному, оброблювальні методи (дзвінки) зберігаються в масиві і кожен викликається, коли подія "запускається".
Опублікувати-Підписатися
Недоліком систем подій Observer є те, що ви можете реєструвати обробники лише у фактичному об'єкті події (або у списку обробників). Тож у час реєстрації подія вже має існувати.
Ось чому існує другий стиль систем подій:
схема публікації-підписки . Тут обробники реєструються не в об'єкті події (або в списку обробників), а в центральному диспетчері. Також сповіщувачі спілкуються лише з диспетчером. Що слухати чи що публікувати, визначається «сигналом», що є не що інше, як ім’я (рядок).
Шаблон посередника
Можливо, це також буде цікавим: модель посередника .
Гачки
Система "гачок" зазвичай використовується в плагінах додатків. Додаток містить фіксовані точки інтеграції (гачки), і кожен плагін може підключитися до цього гака та виконати певні дії.
Інші "події"
Примітка: threading.Event не є «системою подій» у вищезгаданому сенсі. Це система синхронізації потоків, де один потік чекає, поки інший потік «сигналізує» об’єкт події.
Мережеві бібліотеки обміну повідомленнями часто також використовують термін "події"; іноді вони подібні за концепцією; іноді ні. Звичайно, вони можуть перетинати межі потоку, процесів та комп'ютера. Див., Наприклад,
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Слабкі посилання
У Python, посилання на метод або об’єкт гарантує, що він не буде видалений смітником. Це може бути бажано, але це також може призвести до витоку пам'яті: пов'язані обробники ніколи не очищаються.
Деякі системи подій використовують для вирішення цього питання слабкі посилання замість звичайних.
Деякі слова про різні бібліотеки
Системи подій у стилі спостерігача:
- zope.event показує голі кістки, як це працює (див . відповідь Леннарта ). Примітка. Цей приклад навіть не підтримує аргументи обробника.
- Реалізація "списку дзвінків" LongPoke показує, що така система подій може бути реалізована дуже мінімалістично шляхом підкласифікації
list
.
- Варіант Felk EventHook також забезпечує підписи викликів і абонентів.
- EventHook spassig (шаблон події Майкла Форада) - це просто реалізація.
- Клас подій Йосипа Оцінені уроки в основному однаковий, але він використовує
set
замість того, list
щоб зберігати сумку, та інвентар, __call__
який є і розумним доповненням.
- PyNotify подібний за концепцією, а також надає додаткові поняття змінних та умов ("подія, змінена зміною"). Домашня сторінка не функціонує.
- axel - це в основному мішок з великою кількістю функцій, пов’язаних із різьбленням, обробкою помилок, ...
- python-dispatch вимагає отримання рівних класів джерел
pydispatch.Dispatcher
.
- buslane заснований на класах, підтримує одно- або декілька обробників та полегшує підказки широкого типу.
- Спостерігач / подія Pithikos - це легкий дизайн.
Публікація-підписка бібліотек:
- blinker має деякі чудові функції, такі як автоматичне відключення та фільтрація на основі відправника.
- PyPubSub - це стабільний пакет, який обіцяє "розширені функції, що полегшують налагодження та підтримку тем і повідомлень".
- pymitter є портом Python Node.js EventEmitter2 і пропонує простори імен, макіяж та TTL.
- Здається, PyDispatcher підкреслює гнучкість щодо публікації багатьох до багатьох тощо. Підтримує слабкі посилання.
- louie - це перероблений PyDispatcher і повинен працювати "в найрізноманітніших контекстах".
- pypydispatcher заснований на (ви здогадалися ...) PyDispatcher, а також працює в PyPy.
- django.dispatch - це переписаний PyDispatcher "з більш обмеженим інтерфейсом, але більш високою продуктивністю".
- pyeventdispatcher заснований на диспетчері подій PHP в Symfony.
- диспетчер був вилучений з django.dispatch, але він стає досить старим.
- Крістіан Гарсія EventManger - це дійсно коротка реалізація.
Інші:
- pluggy містить систему гака, яка використовується
pytest
плагінами.
- RxPy3 реалізує шаблон "Спостереження" і дозволяє об'єднувати події, повторити і т.д.
- Сигнали та слоти Qt доступні у PyQt
або PySide2 . Вони працюють як зворотний виклик, коли вони використовуються в одному потоці або як події (використовуючи цикл подій) між двома різними потоками. Сигнали та слоти мають обмеження, що вони працюють лише в об'єктах класів, які походять від
QObject
.