python 事件通知模式_Python中的事件系统

本文介绍了事件系统的两种基本样式:“处理程序方法包”和“发布-订阅”模式。前者通过将处理程序方法存储在数组中并在事件触发时调用,后者则通过在中央调度程序上注册处理程序并使用信号进行通知或发布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结答案中提到的各种事件系统:

事件系统最基本的样式是“处理程序方法包”,这是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可能会感兴趣的为好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值