我的问题是一个非常广泛的问题。既然可以使用对象,为什么还要使用协程呢?我可以轻松实现一个迭代器,该迭代器仅在 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))
Run Code Online (Sandbox Code Playgroud)
您可以将其重写为:
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
Run Code Online (Sandbox Code Playgroud)
这有效。但即使有了这个微型示例,在不使用协程时我们也必须编写更多内容。在更复杂的有状态协程中,程序员必须手动跟踪当前状态、哪些变量在当前状态下有意义等。
Python 中的协程(类似地async,await现代 JavaScript 以及未来的 C++ 中)会自动将线性代码转换为具有良好控制输入、轻松错误处理等的状态机。
| 归档时间: |
|
| 查看次数: |
2373 次 |
| 最近记录: |