从网络上说
[当您在Python中具有异步函数(协程)时,可以使用async def对其进行声明,这会更改其调用行为。特别是,调用它会立即返回一个协程对象,该对象基本上说:“我可以使用调用的参数来运行协程,并在等待我时返回结果”]
因此,当您不等待而调用async
函数时,将返回一个协程。
为什么我要返回一个协程,为什么不只是一个generator?因为我不会在将来发送任何输入。
协程最初在Python 3.4中出现时,它们是使用生成器实现的:
import asyncio
from typing import Generator
@asyncio.coroutine
def test1():
pass
assert isinstance(test1(), Generator)
不是因为协程始终应该是生成器,只是发生了,它们是:这是实现它们的最方便的方法。
[从Python 3.5coroutines got their new syntaxasync def
/ await
开始,这不仅更干净,而且还有助于将抽象(协程)与其实现细节(生成器)区分开。
似乎还对新型协程进行了修补,以表明不应将它们视为生成器:
async def test2():
pass
assert not isinstance(test2(), Generator)
长话短说:与协程打交道时,请不要考虑生成器。如果您使用像协程这样的asyncio的抽象,则应该使用它们而不是它们的实现细节。