将 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
。
转换函数时请记住以下几点:
- 不要用
@gen.coroutine
修饰 async def
函数(就像您在第二个代码示例中所做的那样)。
- 将
yield
关键字替换为 await
关键字。
yield None
语句有效,但 await None
无效。
- 您可以
yield
列表(例如 yield [f1(), f2()]
),但对于 await
,请使用 await gen.multi(f1(), f2())
或 await asyncio.gather(f1(), f2())
。 (感谢本提到这一点。)
我需要更改以下遗留龙卷风代码以调用异步函数 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
。
转换函数时请记住以下几点:
- 不要用
@gen.coroutine
修饰async def
函数(就像您在第二个代码示例中所做的那样)。 - 将
yield
关键字替换为await
关键字。 yield None
语句有效,但await None
无效。- 您可以
yield
列表(例如yield [f1(), f2()]
),但对于await
,请使用await gen.multi(f1(), f2())
或await asyncio.gather(f1(), f2())
。 (感谢本提到这一点。)