跳至主要內容

协程的历史演进

guodongAndroid大约 2 分钟

协程的历史演进

如前所述,协程是一个过时但功能强大的概念。多年以来,有几种编程语言已经发展了它们自己的协程实现版本。例如,在 Python 和 Smalltalk 等语言中,协程是一等公民,无需外部库即可使用。

Python 中的生成器如下所示:

def coroutine():
    while True:
        value = yield
        print(’Received a value:, value)

上诉代码定义了一个函数,在函数中有一个死循环,在死循环中监听并打印你发送给它的任何参数。监听数据的死循环的逻辑称为生成器。关键字 yield 是触发生成器与接收值的关键。如你所见,函数中有一个 while True 语句。由于没有退出条件,在常规代码中,这将创建一个标准的死循环并阻塞程序运行。但这是一个基于协程的调用,所以它会在后台等待,直到你向函数发送一些值,因此它不会阻塞程序运行。

另一种把协程作为一等公民的语言是 C#。C# 与 Python 同样支持 yield 语句,但 C# 也支持 asyncawait 调用,如下所示:

MyResult result = await AsyncMethodThatReturnsAResult();
await AsyncMethodWithoutAResult();

通过添加 await 关键字,你可以使用正常的代码顺序返回异步结果。这几乎和你在前面第一次了解协程时的示例一样。

Python 和 C# 都对协程提供一等公民的支持。通过把协程引入语言层面,这样你就无需引用任何第三方框架就可以编写异步程序。很多其他的语言通过第三方库来支持使用协程进行编程。Kotlin 同样有协程标准库支持。此外,Kotlin 协程还使用全局和扩展函数与接收者构建的方式,使得它们非常容易扩展。你也可以在现有函数的基础上构建自己的 API。

你将在本书的后续章节中看到如何实现这一点。