课时 14 · 协程
课时 14 · 协程(Lua 进阶):理解协程与线程的区别及用途。含可运行的示例代码、练习与验收要点,示例锁定 Lua 5.1,可在站内在线运行验证。
本课的代码可以就地复制;点代码块右上角的「运行这段」, 会带着这段代码打开 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
参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。