协程的历史演进
大约 2 分钟
协程的历史演进
如前所述,协程是一个过时但功能强大的概念。多年以来,有几种编程语言已经发展了它们自己的协程实现版本。例如,在 Python 和 Smalltalk 等语言中,协程是一等公民,无需外部库即可使用。
Python 中的生成器如下所示:
def coroutine():
while True:
value = yield
print(’Received a value:’, value)
上诉代码定义了一个函数,在函数中有一个死循环,在死循环中监听并打印你发送给它的任何参数。监听数据的死循环的逻辑称为生成器。关键字 yield
是触发生成器与接收值的关键。如你所见,函数中有一个 while True
语句。由于没有退出条件,在常规代码中,这将创建一个标准的死循环并阻塞程序运行。但这是一个基于协程的调用,所以它会在后台等待,直到你向函数发送一些值,因此它不会阻塞程序运行。
另一种把协程作为一等公民的语言是 C#。C# 与 Python 同样支持 yield
语句,但 C# 也支持 async
和 await
调用,如下所示:
MyResult result = await AsyncMethodThatReturnsAResult();
await AsyncMethodWithoutAResult();
通过添加 await
关键字,你可以使用正常的代码顺序返回异步结果。这几乎和你在前面第一次了解协程时的示例一样。
Python 和 C# 都对协程提供一等公民的支持。通过把协程引入语言层面,这样你就无需引用任何第三方框架就可以编写异步程序。很多其他的语言通过第三方库来支持使用协程进行编程。Kotlin 同样有协程标准库支持。此外,Kotlin 协程还使用全局和扩展函数与接收者构建的方式,使得它们非常容易扩展。你也可以在现有函数的基础上构建自己的 API。
你将在本书的后续章节中看到如何实现这一点。