覆盖方法on_finish()。
用.gen.coroutine
装饰该方法以使其异步,它可以工作。
@gen.coroutine
def on_finish(self):
print("==========on_finish==============")
但是使用async def
使其异步,则失败。
async def on_finish(self):
print("==========on_finish==============")
# RuntimeWarning: coroutine 'BaseHandler.on_finish' was never awaited
self.on_finish()
为什么不能使用async def
使其异步?
答案 0 :(得分:0)
协程的接口与常规函数的接口不同。覆盖方法时,应根据其文档将其设为协程(或不协程)。龙卷风中所有可能是协程的可重写方法在其文档中都这样说,...
不是其中一种。
如果超类不期望使用协程,会发生什么?如您所见,这取决于协程的种类。 on_finish
是“自我启动”的,因此协程将启动,但是没有任何等待完成的协程,并且如果引发异常,则无处可捕获该异常(因此将其记录下来由IOLoop)。 @gen.coroutine
协程不会自动启动,它们必须 async def
,因此,如果您在呼叫者不期望有协程的地方使用协程,则不会发生任何事情。
如果需要在不允许的方法中使用协程,则需要确定谁将等待协程并处理其异常。如果您不需要捕获异常并将它们留在日志中,则可以使用await
明确地将这种责任赋予IOLoop:
IOLoop.add_callback