总结答案中提到的各种事件系统:
事件系统最基本的样式是“处理程序方法包”,这是Observer模式的简单实现。基本上,处理程序方法(可调用函数)存储在数组中,并在事件“触发”时分别调用。
zope.event显示了其工作原理的基本内容(请参阅Lennart的答案)。注意:此示例甚至不支持处理程序参数。
LongPoke的“可调用列表”实现表明,可以通过子类化非常简单地实现这样的事件系统list。
spassig的EventHook(Michael Foord的事件模式)是一个简单的实现。
Josip的Valued Lessons Event类基本上是相同的,但是使用a set代替a list来存储包,并且实现__call__都是合理的补充。
PyNotify在概念上类似,还提供了变量和条件(“变量更改事件”)的其他概念。
axel基本上是一个处理程序包,具有与线程,错误处理,...相关的更多功能。
这些事件系统的缺点是只能在实际的Event对象(或处理程序列表)上注册处理程序。因此,在注册时,该事件已经需要存在。
这就是为什么存在第二种事件系统样式的原因:publish-subscribe模式。在这里,处理程序不在事件对象(或处理程序列表)上注册,而是在中央调度程序上注册。通知者也仅与调度程序对话。侦听或发布的内容由“信号”确定,仅是名称(字符串)。
方向指示灯具有一些漂亮的功能,例如自动断开连接和基于发件人的过滤。
乍一看,PyPubSub似乎很简单。
PyDispatcher似乎强调了多对多发布等方面的灵活性。
路易是一个经过改进的PyDispatcher“提供包括扭曲和PyQt的具体支持插件的基础设施”。在2016年1月之后,它似乎失去了维护。
django.dispatch是重写的PyDispatcher,“界面更有限,但性能更高”。
Qt的信号和插槽可从PyQt或PySide获得。当在同一线程中使用时,它们可用作回调,或在两个不同线程之间用作事件(使用事件循环)。信号和插槽的局限性是它们仅在从派生的类的对象中工作QObject。
注意:从上述意义上讲,threading.Event不是“事件系统”。这是一个线程同步系统,其中一个线程等待,直到另一个线程“标记” Event对象。
注:未列入以上是pypydispatcher,蟒蛇,调度和的“钩子系统” pluggy可能会感兴趣的为好。