Python 中的抽象方法异步和同步实现
abstract method async and sync implementation in Python
假设我有 BaseClass
,其中包含 main_function()
中的一些逻辑,这对于 SyncClass
和 AsyncClass
都是通用的。假设这 2 类 有其独特的 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。
另一件事是:我在 AsyncClass
中有 @gen.coroutine
,而在 BaseClass
中没有用 @gen.coroutine
修饰相同的函数。
谢谢!
同步和异步方法有不同的接口(这就是异步的意思)。 AsyncClass.get_data
returns一个Future
; SyncClass.get_data
没有。如果这是在静态类型语言中,这两个方法将无法从基础 class 实现相同的抽象方法。当然, Python 更灵活,不会以这种方式限制你,但调用者仍然需要知道它处理的是哪种方法,或者准备通过 try/except
或 isinstance
检查等(注意 try/except 在这种情况下是危险的,因为在龙卷风协程中 yield
会接受列表和字典之类的东西)
一般来说,您不能像您希望的那样在它们之间透明地切换。请记住,任何可能调用 yield self.get_data()
的函数也需要用 @coroutine
修饰,因此一旦您的系统的一部分是异步的,它就会开始蔓延。通常最好接受这种趋势并使事情异步。
假设我有 BaseClass
,其中包含 main_function()
中的一些逻辑,这对于 SyncClass
和 AsyncClass
都是通用的。假设这 2 类 有其独特的 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。
另一件事是:我在 AsyncClass
中有 @gen.coroutine
,而在 BaseClass
中没有用 @gen.coroutine
修饰相同的函数。
谢谢!
同步和异步方法有不同的接口(这就是异步的意思)。 AsyncClass.get_data
returns一个Future
; SyncClass.get_data
没有。如果这是在静态类型语言中,这两个方法将无法从基础 class 实现相同的抽象方法。当然, Python 更灵活,不会以这种方式限制你,但调用者仍然需要知道它处理的是哪种方法,或者准备通过 try/except
或 isinstance
检查等(注意 try/except 在这种情况下是危险的,因为在龙卷风协程中 yield
会接受列表和字典之类的东西)
一般来说,您不能像您希望的那样在它们之间透明地切换。请记住,任何可能调用 yield self.get_data()
的函数也需要用 @coroutine
修饰,因此一旦您的系统的一部分是异步的,它就会开始蔓延。通常最好接受这种趋势并使事情异步。