作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
覆盖方法 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
async def
让它异步?
最佳答案
协程具有与常规函数不同的接口(interface)。覆盖方法时,应根据其文档将其设为协程(或不设为协程)。 Tornado 中所有可能是协程的可覆盖方法在他们的文档中都有说明,on_finish
不是其中之一。
如果你在父类(super class)不期望的情况下使用协程会发生什么?如您所见,这取决于协程的类型。 @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):
...
关于asynchronous - Tornado ,使 on_finish() 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375536/
覆盖方法 on_finish()。 用 .gen.coroutine 装饰这个方法为了使它异步,它起作用了。 @gen.coroutine def on_finish(self): print
我是一名优秀的程序员,十分优秀!