开发者社区> 问答> 正文

协程与python中的类

当人们可以使用对象时,为什么会使用协同程序?我可以很容易地实现一个在next()下只能工作一次的迭代器,之后你必须调用o.send(x)。对于协同程序还有什么比通过OOP可以实现的状态持久性更多的东西?它们更轻吗?它只是语法糖吗?我实际上可能会问关于生成器与迭代器的相同问题,但我认为我已经读过生成器只是语法糖。

如果确实如此,为什么协同程序如此重要?

展开
收起
一码平川MACHEL 2019-01-23 17:17:49 1899 0
1 条回答
写回答
取消 提交回答
  • 是的,技术上的协同程序是语法糖,但不是微不足道的。任何协程可以潜在地手动重新写入而不使用yield,send等等。然而这种转化可能是痛苦的。考虑(从这里改编):

    def print_name(prefix):
    print("Searching prefix: {}".format(prefix))
    while True:

    firstName = (yield)
    lastName = (yield)
    if prefix in firstName or prefix in lastName:
      print("{} {}".format(firstName, lastName))

    您可以将其重写为:

    class NamePrinter(object):
    def __init__(self, prefix):

    self.prefix = prefix
    self.gotFirstName = False
    

    def send(self, data):

    if not self.gotFirstName:
      self.firstName = data
      self.gotFirstName = True
    else:
      self.lastName = data
      if self.prefix in self.firstName or self.prefix in self.lastName:
        print(name)
      self.gotFirstName = False

    这有效。但即使使用这个微小的例子,我们还必须在不使用协程时写出更多内容。在更复杂的有状态协程中,程序员必须手动跟踪当前状态,哪些变量在当前状态下有意义等。

    Python中的协同程序(以及类似的async/ await现代JavaScript以及未来的C ++)自动将线性代码转换为具有良好控制输入,易于错误处理等的状态机。

    2019-07-17 23:26:46
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载