我的问题很广泛。当可以使用对象时,为什么要使用协程?我可以轻松地实现一个在next()下仅工作一次的迭代器,然后您必须调用o.send(x)。除了通过OOP可以实现的状态持久化之外,协程还需要做更多的事情吗?他们更轻吗?它是 just 语法糖吗?实际上,我可以对生成器与迭代器问同样的问题,但是我想我已经读到生成器只是语法糖。
如果确实如此,协程为何如此重要?我确定我想念他们一些东西,但我不知道是什么。
答案 0 :(得分:2)
是的,协程在技术上是语法糖,但不是琐碎的糖。无需使用yield
,send
等,任何协程都可以手动进行重写。但是,这种转换可能很痛苦。考虑一下(改编自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)
协程是一种向应用程序添加异步操作的方法。对象只是应用程序中保存信息或工作的事物。因此,两者一起用于创建异步应用程序。