我知道 pydispatcher ,但 Python 周围肯定还有其他与事件相关的包。
哪些图书馆可用?
我对属于大型框架的事件管理器不感兴趣,我宁愿使用可以轻松扩展的小型准系统解决方案。
原文由 Josip 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道 pydispatcher ,但 Python 周围肯定还有其他与事件相关的包。
哪些图书馆可用?
我对属于大型框架的事件管理器不感兴趣,我宁愿使用可以轻松扩展的小型准系统解决方案。
原文由 Josip 发布,翻译遵循 CC BY-SA 4.0 许可协议
我一直这样做:
class Event(list):
"""Event subscription.
A list of callable objects. Calling an instance of this will cause a
call to each item in the list in ascending order by index.
Example Usage:
>>> def f(x):
... print 'f(%s)' % x
>>> def g(x):
... print 'g(%s)' % x
>>> e = Event()
>>> e()
>>> e.append(f)
>>> e(123)
f(123)
>>> e.remove(f)
>>> e()
>>> e += (f, g)
>>> e(10)
f(10)
g(10)
>>> del e[0]
>>> e(2)
g(2)
"""
def __call__(self, *args, **kwargs):
for f in self:
f(*args, **kwargs)
def __repr__(self):
return "Event(%s)" % list.__repr__(self)
然而,就像我见过的其他所有东西一样,没有为此自动生成的 pydoc,也没有签名,这真的很糟糕。
原文由 L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 发布,翻译遵循 CC BY-SA 2.5 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
PyPI 包
截至 2022 年 10 月,这些是 PyPI 上可用的事件相关包,按最近的发布日期排序。
2.0.6
:2022 年 8 月1.5
:2022 年 6 月0.4.0
:2022 年 6 月0.2.0
:2022 年 4 月1.0.0
:2021 年 8 月4.5.0
:2020 年 9 月1.0.1
:2020 年 6 月2.0
:2019 年 9 月4.0.3
:2019 年 1 月0.2.3a0
:20180.0.5
: 20182.1.2
:20170.0.7
: 20161.0
: 20120.3.1
:2008还有更多
有很多库可供选择,使用非常不同的术语(事件、信号、处理程序、方法分派、挂钩……)。
我试图对上述软件包以及此处的答案中提到的技术进行概述。
首先,一些术语…
观察者模式
事件系统最基本的样式是“处理程序方法包”,它是 观察者模式 的简单实现。
基本上,处理程序方法(可调用对象)存储在一个数组中,并在事件“触发”时调用每个方法。
发布-订阅
观察者事件系统的缺点是您只能在实际事件对象(或处理程序列表)上注册处理程序。所以在注册时,该事件已经存在。
这就是存在第二种事件系统样式的原因: 发布-订阅模式。在这里,处理程序不在事件对象(或处理程序列表)上注册,而是在中央调度程序上注册。此外,通知者只与调度员交谈。收听什么,或者发布什么,是由“signal”决定的,无非就是一个名字(字符串)。
中介者模式
可能也很有趣: 中介者模式。
挂钩
“挂钩”系统通常用于应用程序插件的上下文中。该应用程序包含固定的集成点(挂钩),每个插件都可以连接到该挂钩并执行某些操作。
其他“事件”
注意: threading.Event 不是上述意义上的“事件系统”。这是一个线程同步系统,其中一个线程等待另一个线程向 Event 对象发出“信号”。
网络消息传递库也经常使用术语“事件”;有时这些在概念上是相似的;有时不是。它们当然可以跨越线程、进程和计算机的边界。参见例如 pyzmq 、 pymq 、 Twisted 、 Tornado 、 gevent 、 eventlet 。
弱引用
在 Python 中,持有对方法或对象的引用可确保它不会被垃圾收集器删除。这可能是可取的,但它也可能导致内存泄漏:链接的处理程序永远不会被清理。
一些事件系统使用弱引用而不是常规引用来解决这个问题。
关于各种图书馆的一些话
观察者式事件系统:
list
。set
而不是list
来存储包,并实现__call__
都是合理的加法。pydispatch.Dispatcher
。发布订阅库:
其他:
pytest
插件使用。QObject
的类的对象。