首页 > 解决方案 > 我应该在事件发射器中选择处理程序的“集合”还是“列表”?

问题描述

我应该在我的事件发射器中选择一个set或多个处理程序吗?list

除了性能,有经验的程序员应该/会选择什么? 这个决定还有哪些其他方面

几种主要语言都用于列表。我的是一个 RPC 框架,所以它需要清晰,易于使用,并且不会意外触发更复杂的用例。

优点set

优点list

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()

标签: pythonpython-asyncio

解决方案


当数据顺序很重要时,我建议使用列表。作为一个序列。而且,如果您只需要将数据存储在随机集中通常会更好。如果你问我的建议。我会选择集合,因为它们具有更好的性能,并且当数据变大时,它不会遭受与列表相同的后果,即大的读取时间。


推荐阅读