【问题标题】:Are these two kinds of generator-based coroutines the same concept?这两种基于生成器的协程是同一个概念吗?
【发布时间】:2018-03-31 12:09:02
【问题描述】:

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

  1. 来自a reply 吉姆·法萨拉基斯·希利亚德:

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

  2. 从 Python in a Nutshell,它没有明确地调用它 “基于生成器的协程”:

    当您基于asyncio 编写 Python 代码时(理想情况下也使用 来自 asyncio.org 的附加模块),您通常会编写 协程函数。最高包括 Python 3.4,此类函数 是使用“yield”中涵盖的yield from 语句的生成器 来自 (v3-only)”,第 95 页,用 @asyncio.coroutine 装饰, 在第 518 页的“异步协程”中进行了介绍;

    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 也称它为“基于生成器的协程”。

这两种基于生成器的协程是同一个概念吗?

如果不是,它们在用途和用途上有什么区别?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      asyncio.coroutine 较旧,早于 async 协程的引入,并且由于存在 async 协程,它的功能已经从原来的行为有所改变。

      asyncio.coroutinetypes.coroutine 的行为略有不同,尤其是在应用于生成器函数以外的任何东西时,或者如果 asyncio 在 debug mode 中。

      【讨论】:

        猜你喜欢
        • 2018-02-02
        • 2015-12-11
        • 2010-09-24
        • 2016-07-16
        • 1970-01-01
        • 2020-02-27
        • 2013-11-25
        • 2016-06-16
        • 2012-07-16
        相关资源
        最近更新 更多