这两种基于生成器的协同程序是否具有相同的概念?

时间:2017-10-19 12:41:45

标签: python python-3.x asynchronous generator coroutine

似乎有两种基于生成器的协程:

  1. 来自a reply 作者:Jim Fasarakis Hilliard:

      

    基于生成器的协程:由types.coroutine包装的生成器(@Input() isDetached: boolean + def)。你需要把它包起来   yield如果您需要将其视为协程对象。

  2. 从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 也称之为"基于生成器的协程"。

  3. 这两种基于生成器的协同程序是否具有相同的概念?

    如果没有,他们在目的和用途上的差异是什么?

    感谢。

2 个答案:

答案 0 :(得分:2)

就我而言,async def是定义协程的正确方式。 yieldyield from在发生器中有其用途,它们也用于实现“期货”,它是处理不同协程上下文之间切换的低级机制。

几个月前我做this diagram总结了他们之间的关系。但坦率地说,你可以放心地忽略整个业务。事件循环的任务是处理管理协同程序执行的所有低级细节,因此请使用其中一个,如asyncio。还有asyncio - 兼容其他事件循环的包装器,比如我自己的glibcoro用于GLib / GTK。

换句话说,坚持使用asyncio API,您可以编写“事件循环不可知”协程!

答案 1 :(得分:2)

他们是同一种协程。 types.coroutineasyncio.coroutine只是创建它们的两种不同方式。

asyncio.coroutineasync协同程序的引入更早,并且由于async协同程序存在,其功能已经从原来的行为稍微改变了。

asyncio.coroutinetypes.coroutine的行为略有不同,特别是如果应用于生成器函数以外的任何内容,或者asyncio位于debug mode中。