首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pythonic异步事件系统的设计考虑

pythonic异步事件系统的设计考虑
EN

Stack Overflow用户
提问于 2020-07-26 21:27:00
回答 1查看 19关注 0票数 0

我有一个小的事件异步事件系统,如下所示:

代码语言:javascript
复制
from collections import defaultdict
from uuid import uuid4

class EventSystem:
    def __init__(self):
        self.handlers = defaultdict(dict)

    def register_handler(self, event, callback, register_id=None):
        register_id = register_id or uuid4()
        self.handlers[event][register_id] = callback
        return register_id

    def unregister_handler(self, event, register_id):
        del self.handlers[event][register_id]

    def clear_handlers(self, event):
        handler_register_ids = list(self.handlers[event].keys())
        for register_id in handler_register_ids:
            self.unregister_handler(event, register_id)

    async def fire_event(self, event, data):
        handlers = self.handlers[event]
        for register_id, callback in handlers.items():
            await callback(data)
        return len(handlers)

它当前强制处理程序是async函数。

我不能决定哪个更有pythonic风格,执行这个策略,并为同步函数使用async2sync包装器:

代码语言:javascript
复制
async def async2sync(func, *args, **kwargs):
     return func(*args, **kwargs)

或者使用inspect.isawaitablefire_event更改为检查处理程序类型

代码语言:javascript
复制
    async def fire_event(self, event, data):
        handlers = self.handlers[event]
        for register_id, callback in handlers.items():
            ret = callback(data)
            if inspect.isawaitable(ret):
                await ret
        return len(handlers)

我不担心长时间运行或阻塞同步函数。

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 05:52:55

既然第一种方法中的包装器将同步函数包装到异步中,那么它不应该被称为sync2async而不是async2sync

如果不关心长时间运行或阻塞同步函数,这两种方法都可以。两者都有好处和缺点。第一种方法更简约,更容易理解。第二种方法更聪明(它可以在你最意想不到的时候咬你),但也更容易使用,因为你可以只为handler编写任何一种函数,事情就会“正常工作”。如果您的API的用户不是您自己,他们可能会喜欢它。

TL;DR都不错;我个人可能会选择第二种。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63100765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档