Python 为什么我要在“@asyncio.coroutine”上使用“async def”?
Python3.5使用新的函数定义语法大大扩展了对异步编程的支持。而异步函数以前只是“具有优势的生成器”: 它们现在有自己的特殊声明语法和特殊行为,不再像通常的生成器函数那样可用:Python 为什么我要在“@asyncio.coroutine”上使用“async def”?,python,python-3.x,asynchronous,async-await,backwards-compatibility,Python,Python 3.x,Asynchronous,Async Await,Backwards Compatibility,Python3.5使用新的函数定义语法大大扩展了对异步编程的支持。而异步函数以前只是“具有优势的生成器”: 它们现在有自己的特殊声明语法和特殊行为,不再像通常的生成器函数那样可用: aysnc def generate_async_native(): """ A coroutine that returns 1 - 100 This CANNOT be used as a generator, and can ONLY be executed by running it
aysnc def generate_async_native():
"""
A coroutine that returns 1 - 100
This CANNOT be used as a generator, and can ONLY be executed by running it from an event loop
"""
for i in range(100):
await i
这是而不是关于这些类型之间的功能或实际差异的问题,在中进行了讨论
我的问题是:我为什么要使用async def
?与@asyncio.coroutine
相比,它似乎没有提供任何额外的好处,但却带来了额外的成本
async def
甚至不会在旧版本中解析,尽管这可能是一个特性,而不是一个bug)和一个可能的答案是: 其优点是,通过本机支持,还可以引入其他语法来支持异步上下文管理器和迭代器。进入和退出一个上下文管理器,或者循环遍历一个迭代器,可能会成为您的共同例程中的更多点,表明其他代码可以运行,因为有东西再次等待
事实上,新的
async with
和async for
语法实现了这一点,它不能像装饰过的生成器那样用“附加”解决方案轻松实现。我删除了syntax
标记,并添加了python
标记。通常,您应该将python标记添加到所有python问题中,因为大多数人都会跟踪它。
aysnc def generate_async_native():
"""
A coroutine that returns 1 - 100
This CANNOT be used as a generator, and can ONLY be executed by running it from an event loop
"""
for i in range(100):
await i