基于协程和本地协程

我刚刚读到了PEP0492,谈到了协程的新方法,但是PEP没有让我明白基于生成器的协程和本地协程之间的区别。 有人可以告诉我有什么不同(也许有例子)?

对于我所理解的,他们使用不同的词语(产量/产量和等待/异步/产量)。 我知道在本地协程结束时预计会有收益,但这对于基于生成器的收益也是如此。


没有功能差异。 使用asyncawait关键字的“本机协同程序”仅仅是以前在“基于生成器的协同程序”中实现的语法糖。

如果不需要支持较老的Python版本 ,则在3.5文档中推荐使用asyncawait


为了扩展Mike S所写的内容:CPython中的本地协程与发生器共享大部分相同的代码,所以几乎没有功能差异。 不过,我认为PEP-492超过了“语法糖”的门槛。 生成器和本机协同程序有不同的目的,所以新的语法可以澄清作者的意图,并且可以做旧语法所不能做的事情。 这里有些例子:

  • 发生器是可迭代的,本地协程不是。
  • await foo是一个表达式,而yield from foo是一个语句,这意味着await可以用于yield from不能yield from地方。
  • 本地协程还允许新的语法,如异步上下文管理器和异步迭代器。
  • 协程有很多有用的调试信息,例如,如果你从不await协程对象,就会发出警告。
  • 新的语法也很好地反映了asyncio库,并且类似于其他语言中使用的关键字。


    那么,传统上编写协程的方式涉及到回调。 尽管回调最初可能比较方便,但在我看来,它们导致了非常复杂和复杂的代码,至少可以说是非pythonic。 此外, yield (特别是自python 3.3以来的yield from )使得实施协同程序变得更加容易和pythonic。

    使用生成器,您可以轻松地将代码划分为初始部分和回调。

    @asyncio.coroutine
    def print_sum(x, y):
        result = yield from compute(x, y)
    
        #write callback code
        print("%s + %s = %s" % (x, y, result))
    
    链接地址: http://www.djcxy.com/p/53241.html

    上一篇: based coroutine versus native coroutine

    下一篇: Are Python/ES6 Generators also Coroutines?