龙卷风,使on_finish()异步

时间:2018-07-17 07:26:36

标签: asynchronous tornado coroutine

覆盖方法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使其异步?

1 个答案:

答案 0 :(得分:0)

协程的接口与常规函数的接口不同。覆盖方法时,应根据其文档将其设为协程(或不协程)。龙卷风中所有可能是协程的可重写方法在其文档中都这样说,...不是其中一种。

如果超类不期望使用协程,会发生什么?如您所见,这取决于协程的种类。 on_finish是“自我启动”的,因此协程将启动,但是没有任何等待完成的协程,并且如果引发异常,则无处可捕获该异常(因此将其记录下来由IOLoop)。 @gen.coroutine协程不会自动启动,它们必须 async def,因此,如果您在呼叫者不期望有协程的地方使用协程,则不会发生任何事情。

如果需要在不允许的方法中使用协程,则需要确定谁将等待协程并处理其异常。如果您不需要捕获异常并将它们留在日志中,则可以使用await明确地将这种责任赋予IOLoop:

IOLoop.add_callback