将 tornado.gen.coroutine 与 async/await 混合?

Mix tornado.gen.coroutine with async/await?

我需要更改以下遗留龙卷风代码以调用异步函数 async def my_async1(self)

class MyHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self, action):
        ....
        

可以混用吗?如何重构代码?

class MyHandler(tornado.web.RequestHandler):
    @gen.coroutine 
    async def get(self, action):
        ....
        await self.my_async() # ? 
     

我可以只删除 @gen.coroutine 并添加 async 吗?它们完全一样吗?

是的,它们 几乎 相同。 @gen.coroutine 是以前 Python 没有 async/await 关键字的时候。所以 @gen.coroutine 用于将常规函数(或生成器)转换为异步生成器。

对于较新的 python 版本 (3.5+),async/await 语法应该优先于 @gen.coroutine

转换函数时请记住以下几点:

  1. 不要用 @gen.coroutine 修饰 async def 函数(就像您在第二个代码示例中所做的那样)。
  2. yield 关键字替换为 await 关键字。
  3. yield None 语句有效,但 await None 无效。
  4. 您可以 yield 列表(例如 yield [f1(), f2()]),但对于 await,请使用 await gen.multi(f1(), f2())await asyncio.gather(f1(), f2())。 (感谢本提到这一点。)