我知道pydispatcher,但是 Python 必须有其他与事件相关的包。
哪些库可用?
我对作为大型框架一部分的事件管理器不感兴趣,我宁愿使用可以轻松扩展的小型准系统解决方案。
截至 2022 年 1 月,这些是 PyPI 上可用的与事件相关的包,按最近的发布日期排序。
1.0.0
0.3.1
4.5.0
0.1.31
1.0.1
2.0
4.0.3
0.2.3a0
0.0.5
2.1.2
0.0.7
1.4
2.0.5
1.0
有很多库可供选择,使用非常不同的术语(事件、信号、处理程序、方法分派、钩子......)。
我试图保持对上述软件包的概述,以及此处答案中提到的技术。
首先,一些术语…
事件系统最基本的风格是“处理程序方法包”,它是观察者模式的简单实现。
基本上,处理程序方法(可调用对象)存储在一个数组中,并在事件“触发”时被调用。
Observer 事件系统的缺点是您只能在实际的 Event 对象(或处理程序列表)上注册处理程序。因此,在注册时,该事件已经存在。
这就是存在第二种事件系统样式的原因: 发布- 订阅模式。在这里,处理程序不是在事件对象(或处理程序列表)上注册,而是在中央调度程序上。此外,通知者只与调度员交谈。听什么或发布什么由“信号”决定,它只不过是一个名称(字符串)。
可能也很有趣:中介者模式。
“挂钩”系统通常用于应用程序插件的上下文中。应用程序包含固定的集成点(挂钩),每个插件都可以连接到该挂钩并执行某些操作。
注意:threading.Event不是上述意义上的“事件系统”。这是一个线程同步系统,其中一个线程等待直到另一个线程“发出”事件对象的“信号”。
网络消息传递库也经常使用术语“事件”;有时这些在概念上是相似的;有时不是。它们当然可以跨越线程、进程和计算机边界。参见例如 pyzmq、pymq、 Twisted、Tornado、 gevent、eventlet。
在 Python 中,持有对方法或对象的引用可确保它不会被垃圾收集器删除。这可能是可取的,但也可能导致内存泄漏:链接的处理程序永远不会被清理。
一些事件系统使用弱引用而不是常规引用来解决这个问题。
观察者式事件系统:
list
set
__call__
pydispatch.Dispatcher
发布订阅库:
其他:
pytest
QObject