当人们可以使用对象时,为什么会使用协同程序?我可以很容易地实现一个在next()下只能工作一次的迭代器,之后你必须调用o.send(x)。对于协同程序还有什么比通过OOP可以实现的状态持久性更多的东西?它们更轻吗?它只是语法糖吗?我实际上可能会问关于生成器与迭代器的相同问题,但我认为我已经读过生成器只是语法糖。
如果确实如此,为什么协同程序如此重要?
是的,技术上的协同程序是语法糖,但不是微不足道的。任何协程可以潜在地手动重新写入而不使用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 ++)自动将线性代码转换为具有良好控制输入,易于错误处理等的状态机。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。