首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于生成器的协同线与本机协同器的比较

基于生成器的协同线与本机协同器的比较
EN

Stack Overflow用户
提问于 2015-09-15 09:33:41
回答 3查看 2.4K关注 0票数 11

我刚刚读到了PEP0492,讨论了协同工作的新方法,但是PEP未能让我理解基于生成器的协同和本地协同机制之间的区别。有人能告诉我区别吗?(也许举个例子)?

对于我所理解的,他们使用不同的词(产生/屈服和等待/异步/屈服)。我知道,在本机协同线结束时,产量是预期的,但对于基于发电机的产量也是如此。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-04 10:19:45

没有功能上的区别。使用asyncawait关键字的“原生协同”只是以前在“基于生成器的协同”中实现的语法糖。

如果不需要支持较早的Python版本,则asyncawait的使用在3.5博士 中是推荐的。

票数 4
EN

Stack Overflow用户

发布于 2017-03-01 13:44:41

为了扩展Mike所写的内容: CPython中的本机协同器与生成器共享大部分相同的代码,因此功能差异很小。然而,我认为PEP-492超过了“语法糖”的门槛。生成器和本机协同器有不同的用途,因此新语法澄清了作者的意图,并可以完成旧语法所不能做的事情。下面是一些示例:

  • 生成器是可迭代的,而本机协同线则不是。
  • 本机协同器还允许新的语法,如异步上下文管理器和异步迭代器。
  • Coroutines有有用的调试消息,例如,如果您从不await一个协同对象,就会发出警告。

新语法还很好地反映了asyncio库,类似于其他语言中使用的关键字。

票数 11
EN

Stack Overflow用户

发布于 2015-09-15 09:44:27

按照惯例,编写协同线的方式涉及回调。尽管回调一开始可能很方便,但在我看来,它们会导致高度复杂和复杂的代码,至少可以说,这不是节奏曲。此外,yield (特别是自python3.3以来的yield from )使得实现协同任务变得更加容易和python。

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

代码语言:javascript
复制
@asyncio.coroutine
def print_sum(x, y):
    result = yield from compute(x, y)

    #write callback code
    print("%s + %s = %s" % (x, y, result))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32582573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档