协程vs Python中的类

时间:2019-01-22 19:14:09

标签: python coroutine

我的问题很广泛。当可以使用对象时,为什么要使用协程?我可以轻松地实现一个在next()下仅工作一次的迭代器,然后您必须调用o.send(x)。除了通过OOP可以实现的状态持久化之外,协程还需要做更多的事情吗?他们更轻吗?它是 just 语法糖吗?实际上,我可以对生成器与迭代器问同样的问题,但是我想我已经读到生成器只是语法糖。

如果确实如此,协程为何如此重要?我确定我想念他们一些东西,但我不知道是什么。

2 个答案:

答案 0 :(得分:2)

是的,协程在技术上是语法糖,但不是琐碎的糖。无需使用yieldsend等,任何协程都可以手动进行重写。但是,这种转换可能很痛苦。考虑一下(改编自here):

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中的协程(以及类似的现代JavaScript和将来的C ++中的async / await)可将线性代码自动转换为状态机,并具有良好控制的输入,易于执行的错误处理等。

答案 1 :(得分:0)

协程是一种向应用程序添加异步操作的方法。对象只是应用程序中保存信息或工作的事物。因此,两者一起用于创建异步应用程序。

https://www.geeksforgeeks.org/coroutine-in-python/