首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的抽象方法异步和同步实现

Python中的抽象方法异步和同步实现
EN

Stack Overflow用户
提问于 2017-04-01 23:17:39
回答 1查看 1.3K关注 0票数 1

假设我有BaseClass,它包含了main_function()中的一些逻辑,这对于SyncClassAsyncClass来说都很常见。假设这两个类有其独特的get_data()实现,前者以同步的方式实现,而后者以异步的方式实现。我写过这样的东西,它似乎奏效了:

代码语言:javascript
复制
class BaseClass:
    def get_data():
        pass

    @gen.coroutine
    def main_function():
        # some logic
        try:
            data = yield self.get_data()
        except:
            data = self.get_data()
        # some more logic

class SyncClass(BaseClass):
    def get_data():
        //makes sync call to Mongo and gets data (using Mongoengine)

class AsyncClass(BaseClass):
    @gen.coroutine
    def get_data():
        //makes async call to Mongo and gets data (using Motorengine)

我使用这段代码作为解决办法,因为我已经有了这些get_data()方法的实现方式。有没有更优雅的解决方案?我的代码中有两部分与我有关:

代码语言:javascript
复制
try:
    data = yield self.get_data()
except:
    data = self.get_data()

除了这里,我不想用试/试。

另一件事是:我在@gen.coroutine中有AsyncClass,而在BaseClass中没有用@gen.coroutine来修饰相同的函数。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-02 14:36:14

同步方法和异步方法有不同的接口(这就是异步的意思)。AsyncClass.get_data返回一个FutureSyncClass.get_data不返回。如果这是静态类型的语言,那么这两个方法将无法实现基类中相同的抽象方法。当然,Python更灵活,并且不以这种方式限制您,但是调用方仍然需要知道它正在处理的是哪种方法,或者准备通过try/exceptisinstance检查来查找,等等(请注意,在这种情况下,尝试/除是危险的,因为龙卷风警报中的yield会接受列表和切分之类的东西)

一般来说,你不能像你希望的那样透明地在它们之间切换。请记住,任何可能调用yield self.get_data()的函数都需要使用@coroutine来修饰,因此一旦系统的一部分是异步的,它就开始扩展。通常最好是接受这一趋势,让事情变得异步。

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

https://stackoverflow.com/questions/43163027

复制
相关文章

相似问题

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