# Lua 协程（Coroutine）

URL: https://caijiao.org/lua/coroutine
Source: docs/lua/coroutine.md
Description: 学习 Lua 协程的基本概念、创建方法、调度与应用，实现轻量级多任务和协作式并发。

协程（Coroutine）是一种 **轻量级线程**，允许程序在执行过程中 **挂起（yield）** 和 **恢复（resume）**，实现 **协作式多任务**，而无需操作系统线程开销。

## 🧩 创建协程

```lua
-- 定义一个协程函数
local co = coroutine.create(function()
  for i = 1, 3 do
    print("协程运行：" .. i)
    coroutine.yield()  -- 挂起
  end
end)
````

## 🔄 启动与恢复

```lua
print(coroutine.status(co))  -- suspended

coroutine.resume(co)  -- 输出：协程运行：1
coroutine.resume(co)  -- 输出：协程运行：2
coroutine.resume(co)  -- 输出：协程运行：3

print(coroutine.status(co))  -- dead
```

* `coroutine.create(func)`：创建协程
* `coroutine.resume(co, ...)`：恢复协程执行
* `coroutine.yield(...)`：挂起协程并可返回值
* `coroutine.status(co)`：查询协程状态，可能值为 `"suspended"`、`"running"`、`"dead"`

## 🧩 协程通信

协程之间可以通过 `yield` 和 `resume` 传递数据：

```lua
local co = coroutine.create(function()
  local x = coroutine.yield("第一次挂起")
  print("收到 x =", x)
end)

local ok, msg = coroutine.resume(co)
print(msg)  -- 输出：第一次挂起

coroutine.resume(co, 42)  -- 输出：收到 x = 42
```

## 🔄 状态管理

协程状态说明：

* `suspended`：挂起状态，可 `resume`
* `running`：正在运行
* `normal`：非主协程中调用其他协程
* `dead`：协程已结束

## 🧠 应用场景

* 游戏开发：任务、动画、AI 状态机
* 数据流处理：按需生成数据
* 异步 IO 模拟：协作式多任务处理

协程的优点是 **轻量、灵活、可控**，适合 Lua 脚本中需要多任务或延迟执行的场景。

## 🧠 小结

* 协程是 Lua 的轻量级线程
* 使用 `create`, `resume`, `yield` 控制执行
* 支持挂起与恢复，实现协作式多任务
* 在游戏、异步处理和流式计算中非常实用
