似乎有两种基于生成器的协程:
来自a reply 作者:Jim Fasarakis Hilliard:
基于生成器的协程:由
types.coroutine
包装的生成器(@Input() isDetached: boolean
+def
)。你需要把它包起来yield
如果您需要将其视为协程对象。
从Nutshell中的Python,它没有明确地调用它 "基于生成器的协程":
当您编写基于
types.coroutine
的Python代码时(理想情况下也使用 来自asyncio.org的附加模块),你通常会写作 协程功能。包括Python 3.4,这样的功能 是使用“yield”中涵盖的asyncio
语句的生成器 来自(v3-only)“第95页,用yield from
装饰, 第518页的“asyncio coroutines”中介绍;
从 https://www.python.org/dev/peps/pep-0492/#differences-from-generators
基于生成器的协同程序(对于asyncio代码必须使用@ asyncio.coroutine进行修饰)
http://masnun.com/2015/11/13/python-generators-coroutines-native-coroutines-and-async-await.html 也称之为"基于生成器的协程"。
这两种基于生成器的协同程序是否具有相同的概念?
如果没有,他们在目的和用途上的差异是什么?
感谢。
答案 0 :(得分:2)
就我而言,async def
是定义协程的正确方式。 yield
和yield from
在发生器中有其用途,它们也用于实现“期货”,它是处理不同协程上下文之间切换的低级机制。
asyncio
- 兼容其他事件循环的包装器,比如我自己的glibcoro
用于GLib / GTK。
换句话说,坚持使用asyncio
API,您可以编写“事件循环不可知”协程!
答案 1 :(得分:2)
他们是同一种协程。 types.coroutine
和asyncio.coroutine
只是创建它们的两种不同方式。
asyncio.coroutine
比async
协同程序的引入更早,并且由于async
协同程序存在,其功能已经从原来的行为稍微改变了。
asyncio.coroutine
和types.coroutine
的行为略有不同,特别是如果应用于生成器函数以外的任何内容,或者asyncio位于debug mode中。