python - 我应该在事件发射器中选择处理程序的“集合”还是“列表”?
问题描述
我应该在我的事件发射器中选择一个set
或多个处理程序吗?list
除了性能,有经验的程序员应该/会选择什么? 这个决定还有哪些其他方面?
几种主要语言都用于列表。我的是一个 RPC 框架,所以它需要清晰,易于使用,并且不会意外触发更复杂的用例。
优点set
:
- 不太可能发生内存泄漏(单个处理程序附件)。
- 更简单的 API,迫使聪明的人在其他地方变得聪明。
优点list
- 更具表现力的 api 用法(可以添加许多相同的处理程序)。
- 订购(取决于实施?)。
class EventEmitter:
def __init__(self):
self._handlers = set()
self._event = asyncio.Event()
self._data = None
def on(self, handler):
if not asyncio.iscoroutinefunction(method):
raise ValueError('expected an async handler')
self._handlers.add(handler)
def off(self, handler):
self._handlers.remove(handler)
async def wait(self):
await self._event.wait()
return self._data
def emit(self, data):
self._data = data
for handler in self._handlers:
try:
loop.call_soon(functools.partial(handler, self._data))
except Exception as err:
log.exception('exception in handler')
self._event.set()
self._event.clear()
解决方案
当数据顺序很重要时,我建议使用列表。作为一个序列。而且,如果您只需要将数据存储在随机集中通常会更好。如果你问我的建议。我会选择集合,因为它们具有更好的性能,并且当数据变大时,它不会遭受与列表相同的后果,即大的读取时间。
推荐阅读
- ios - 通用链接不适用于 http 方案
- ios - 如何在 iOS 中的折线图(图表)的标签中显示文本
- html - 使用类应用的样式不起作用但样式属性有效
- mysql - 用户 'root'@'[PCName]' 的访问被拒绝(使用密码;是)
- c# - 如何使用转换器时间控制进度条?
- sql - 用 COALESCE 重写 CASE WHEN 语句后出错
- php - SQL 从 2 个不同的数据库中检索数据
- function - 如何正确设置衰减学习率回调,并在 xgboost 中将其传递给自定义函数?
- asterisk - 如何限制 Asterisk PJSIP 中的重新注册次数?
- docker - Docker:通过 .ENV 文件访问 JSON 文件