【问题标题】:Python coroutine/generator terminology in async context异步上下文中的 Python 协程/生成器术语
【发布时间】:2020-07-09 12:16:23
【问题描述】:

网上说的是

当你在 Python 中有一个异步函数(协程)时,你用 async def 声明它,这会改变它的调用行为。特别是,调用它会立即返回一个协程对象,基本上是说“我可以使用你调用的参数运行协程,并在你等待我时返回结果”

所以当你调用 async 函数而不等待时,你会得到一个协程。

为什么我要返回一个协程,为什么不只是一个生成器?因为我不会向它发送任何未来的输入。

【问题讨论】:

  • PEP 3156 中定义得更好。
  • 令人困惑的部分是协程这个词现在用于两个相关但不同的概念:一个是 PEP 342 中定义的双向生成器,另一个是 PEP 492 中定义的异步函数。无需等待即可运行,它会为您提供 PEP 492 协程。

标签: python async-await generator python-asyncio coroutine


【解决方案1】:

当协程首次出现在 Python 3.4 中时,它们是使用生成器实现的:

import asyncio
from typing import Generator


@asyncio.coroutine
def test1():
    pass


assert isinstance(test1(), Generator)

这并不是因为协程总是应该是生成器,只是碰巧它们是:这是实现它们的最方便的方式。


从 Python 3.5 coroutines got their new syntaxasync def/await 开始,它既干净又有助于区分抽象(协程)和实现细节(生成器)。

似乎新式协程也被修补以表明它们不应该被视为生成器:

async def test2():
    pass


assert not isinstance(test2(), Generator)

长话短说:在处理协程时忘记生成器。如果你使用协程等 asyncio 的抽象,你应该使用它们而不是它们的实现细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 2018-03-31
    • 2014-05-31
    • 2011-04-29
    • 1970-01-01
    • 2017-09-02
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多