假设我有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()除了这里,我不想用试/试。
另一件事是:我在@gen.coroutine中有AsyncClass,而在BaseClass中没有用@gen.coroutine来修饰相同的函数。
谢谢!
发布于 2017-04-02 14:36:14
同步方法和异步方法有不同的接口(这就是异步的意思)。AsyncClass.get_data返回一个Future;SyncClass.get_data不返回。如果这是静态类型的语言,那么这两个方法将无法实现基类中相同的抽象方法。当然,Python更灵活,并且不以这种方式限制您,但是调用方仍然需要知道它正在处理的是哪种方法,或者准备通过try/except或isinstance检查来查找,等等(请注意,在这种情况下,尝试/除是危险的,因为龙卷风警报中的yield会接受列表和切分之类的东西)
一般来说,你不能像你希望的那样透明地在它们之间切换。请记住,任何可能调用yield self.get_data()的函数都需要使用@coroutine来修饰,因此一旦系统的一部分是异步的,它就开始扩展。通常最好是接受这一趋势,让事情变得异步。
https://stackoverflow.com/questions/43163027
复制相似问题