有了我见过的 asyncio
库,
@asyncio.coroutine
def function():
...
和
async def function():
...
互换使用。
两者之间有什么功能上的区别吗?
原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议
有了我见过的 asyncio
库,
@asyncio.coroutine
def function():
...
和
async def function():
...
互换使用。
两者之间有什么功能上的区别吗?
原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议
async def
是 Python 3.5 的新语法。 You could use await
, async with
and async for
inside async def
s.
@coroutine
is a functional analogue for async def
but it works in Python 3.4+ and yield from
construction instead of await
.
从实用的角度来看,如果您的 Python 是 3.5+,则永远不要使用 @coroutine
。
原文由 Andrew Svetlov 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
是的,使用
async def
语法的原生协程和使用asyncio.coroutine
装饰器的基于生成器的协程之间存在功能差异。根据 PEP 492 ,它引入了
async def
语法:上面的第 1 点意味着,虽然使用
@asyncio.coroutine
装饰器语法定义的协程函数可以像传统生成器函数一样运行,但使用async def
语法定义的协程函数则不能。下面是用这两种语法定义的两个最小的、表面上等价的协程函数:
尽管这两个函数的字节码几乎相同:
…唯一的区别是
GET_YIELD_FROM_ITER
vsGET_AWAITABLE
,当尝试迭代返回的对象时,它们的行为完全不同:显然
'foo'
不是可等待的,因此尝试调用native()
没有多大意义,但希望很清楚coroutine
无论其参数如何,它都返回不可迭代的。Brett Cannon 对
async
/await
语法的更详细调查: How the heck does async/await work in Python 3.5? 更深入地涵盖了这种差异。