课时 14 · 协程

课时 14 · 协程(Lua 进阶):理解协程与线程的区别及用途。含可运行的示例代码、练习与验收要点,示例锁定 Lua 5.1,可在站内在线运行验证。

教程/第二部分 · Lua 进阶更新于 2026-10-073 个小节 教程第 17 / 23 篇 Lua进阶

本课的代码可以就地复制;点代码块右上角的「运行这段」, 会带着这段代码打开 Lua 在线运行器 并直接跑出结果 (课程示例统一按 5.1 跑;运行器里也能切到 5.3)。

本课的代码跑在 996 引擎里,用到的是服务端接口(changeexp、 SetInt 这类),在线运行器里没有这些函数。 每个函数的签名都能在 文档检索 里按名字查到原文。

本课目标

  • 理解协程与线程的区别及用途。

知识讲解

协程(coroutine)是协作式调度:同一时刻只有一个协程在执行,通过 coroutine.yield 主动让出、coroutine.resume 恢复。它不并行,但适合管理需要分段执行、带状态的逻辑。引擎中的个人定时器回调(ontimer{id})就是「每次触发执行一小段」的典型场景,理解协程有助于理解这类调度模型。

示例:协程基本用法

local co = coroutine.create(function()
    for i = 1, 3 do
        print('协程执行', i)
        coroutine.yield(i)
    end
end)

print(coroutine.resume(co))   -- 协程执行 1   true 1
print(coroutine.resume(co))   -- 协程执行 2   true 2
print(coroutine.status(co))   -- suspended

练习任务

  • 用协程模拟多个 NPC 轮流对话的调度:每个 NPC 讲 3 句话,轮流输出。

参考:NPC 轮流对话

local npcs = { { name = '铁匠', words = {'欢迎', '打造装备吗', '下次再来'} },
               { name = '药师', words = {'要买药吗', '效果很好', '保重'} } }
local cos = {}
for _, npc in ipairs(npcs) do
    cos[#cos + 1] = coroutine.create(function()
        for _, w in ipairs(npc.words) do
            print(npc.name, ':', w)
            coroutine.yield()
        end
    end)
end
for round = 1, 3 do
    for _, co in ipairs(cos) do coroutine.resume(co) end
end
本篇依据
  • 《996 新三端 Lua 开发教学技术手册》课时 14

参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。