gpt4 book ai didi

asynchronous - Tornado ,使 on_finish() 异步

转载 作者:行者123 更新时间:2023-12-03 22:15:23 26 4
gpt4 key购买 nike

覆盖方法 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让它异步?

最佳答案

协程具有与常规函数不同的接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com