Lvx*_*uan 4 asynchronous tornado coroutine
覆盖方法 on_finish()。装饰此方法.gen.coroutine以使其异步,它起作用了。
@gen.coroutine
def on_finish(self):
print("==========on_finish==============")
Run Code Online (Sandbox Code Playgroud)
但使用async def使其异步,它失败了。
async def on_finish(self):
print("==========on_finish==============")
# RuntimeWarning: coroutine 'BaseHandler.on_finish' was never awaited
Run Code Online (Sandbox Code Playgroud)
self.on_finish()
为什么我不能async def用来使它异步?
协程具有与常规函数不同的接口。覆盖方法时,您应该根据其文档将其设为协程(或不设为协程)。Tornado 中所有可能是协程的可覆盖方法在他们的文档中on_finish都是这么说的,而不是其中之一。
如果在超类不期望的情况下使用协程会发生什么?如您所见,这取决于协程的类型。@gen.coroutine是“自启动”,因此协程将启动,但不会等待它完成,并且如果它引发异常,则无处可捕获该异常(因此它只会被 IOLoop 记录)。async def协程不会自动启动,它们必须 await有一些东西,所以如果你在调用者不期待协程的地方使用协程,什么都不会发生。
如果您需要从不允许使用的方法中使用协程,则需要决定谁将等待协程并处理其异常。如果您不需要捕获异常并且可以将它们留在日志中,您可以使用IOLoop.add_callback显式将此责任交给 IOLoop:
def on_finish(self):
IOLoop.current().add_callback(self.on_finish_async)
async def on_finish_async(self):
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |