gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:48:46 30 4
gpt4 key购买 nike

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

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() 的那些方法。有一些更优雅的解决方案吗?我的代码有两部分与我有关:

try:
data = yield self.get_data()
except:
data = self.get_data()

我不想在这里使用 try/except 。

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

谢谢!

最佳答案

同步和异步方法具有不同的接口(interface)(这就是异步的含义)。 AsyncClass.get_data 返回一个 FutureSyncClass.get_data 没有。如果这是在静态类型语言中,这两个方法将无法从基类实现相同的抽象方法。当然,Python 更灵活,不会以这种方式限制您,但调用者仍然需要知道它正在处理哪种方法,或者准备通过 try/exceptisinstance 检查等(请注意,在这种情况下 try/except 是危险的,因为 Tornado 协程中的 yield 会接受列表和字典等内容)

一般来说,您无法像您希望的那样在它们之间透明地切换。请记住,任何可能调用 yield self.get_data() 的函数也需要用 @coroutine 修饰,因此一旦系统的某个部分异步,它就会开始传播。通常最好接受这种趋势并让事情变得异步。

关于python - Python 中的抽象方法异步和同步实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163027/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com