协程的设计理念
协程(coroutines)在一个线程中实现非抢占式的多任务处理。Lua 的协程设计围绕几条理念展开:轻量、协作式调度、状态保存与恢复、简化异步编程、可控、易集成。
1. 轻量级
设计目标是避免传统线程的开销。协程在同一线程中运行,没有上下文切换的代价,创建和销毁的成本都低:比线程更省内存和处理器资源,上下文切换发生在协程之间而不是线程之间,速度快得多。
2. 协作式调度
调度由程序员显式控制。与抢占式线程不同,协程需要在代码中显式地暂停和恢复,调度行为因此可预测、可控:coroutine.yield() 暂停,coroutine.resume() 恢复,协程不会被系统中断。
3. 状态保存与恢复
协程暂停时保存执行状态,包括局部变量和调用栈,恢复时从暂停的位置继续。上下文的保存与恢复是协程能反复中断续跑的基础。
4. 简化异步编程
协程让异步操作看起来像同步操作,代码更易理解和维护。异步代码可以写成顺序化的形式,避开回调地狱和复杂的异步编程模型;多个异步任务的管理也更简单,因为它们可以以串行的方式编写和调试。
5. 灵活性与控制
开发者可以灵活控制协程的创建、执行和调度。协程有多种状态(如suspended、running、dead),管理起来足够灵活;何时暂停、何时恢复由开发者决定,适应各种并发编程需求。
6. 易于集成
协程设计与Lua的其他功能自然集成:与标准库函数(coroutine.resume、coroutine.yield)紧密配合,也与表(tables)、函数(functions)等核心语言特性兼容。
总结
轻量级和协作式调度决定了协程的成本模型,状态保存与恢复决定了它能否正确续跑,简化异步编程则是它对使用者的直接价值。这几条理念合在一起,让 Lua 的协程成为易用的并发编程工具。