【问题标题】:Coroutine was never awaited in Tornado在 Tornado 中从未等待协程
【发布时间】:2022-01-02 07:01:06
【问题描述】:

我正在尝试学习 Python 中的异步调用,这是我的代码:

class MyClient:
   def _init_(self):
    
   async def method(self):
      print("xxxxxxx")

还有:

def test_my_client():
    @coroutine
    def test_async_client():
        client = MyClient()
        return client.method()
    result = IOLoop.run_sync(test_async_client)
    print(result)

所以基本上我使用IOLoop.run_sync 来异步调用client.method(),但我永远看不到来自print('xxxxxx') 的痕迹,好像从未触发过client.method()。还有一个警告coroutine client.method was never awaited

如果我print(result),我会看到<coroutine object client.method at >,所以协程对象被返回,并且我理解等待对象被返回并且将被解析或执行? client.method() 被执行了吗?如果是这样,我如何检查对象的内容并查看打印痕迹?

【问题讨论】:

    标签: asynchronous tornado coroutine


    【解决方案1】:

    IOLoop.run_sync 需要一个可调用的(函数、协程),而不是一个可等待的(未来)对象。

    也就是说,不要调用函数,只传递函数本身:

    result = IOLoop.run_sync(test_async_client)
    

    更新:

    另外,你必须等待 client.method() 协程。由于您仍在使用旧的 @coroutine 装饰器(但为什么?),您不能使用 await 关键字。但是,您可以尝试使用 yield 关键字来等待 Future:

    result = yield client.method()
    return result
    

    顺便说一句,您应该只使用新的 async def 语法而不是旧的 @coroutine 装饰器来简化操作。

    【讨论】:

    • 谢谢我修好了,但还是没有运气。协程仍然没有等待。我知道在 Asyncio 中我们有 run_until_complete() 来解决这个问题,但是在 Tornado 中这相当于什么?
    • @LookIntoEast 当你调用它时,你必须等待 MyClient.method 协程。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2019-12-15
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多