HoRain云--Lua协程

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
六、coroutine.wrapvs coroutine.create

Lua 的 协同程序(coroutine) 是一种协作式的多任务机制,它不是操作系统线程,也不并行执行,而是通过 主动让出(yield)和恢复(resume) 来控制执行流。
下面从 本质 → API → 执行模型 → 实战 → 常见坑 系统讲解。
一、什么是 coroutine?
coroutine = 可挂起 / 可恢复的函数
-
✅ 单线程
-
✅ 显式让出控制权(
yield) -
✅ 状态可保留
-
❌ 没有抢占式调度
二、Coroutine 的四种状态
|
状态 |
含义 |
|---|---|
|
suspended |
未启动 / 已挂起 |
|
running |
正在运行 |
|
normal |
正在调用另一个 coroutine |
|
dead |
执行完毕 |
查看状态:
coroutine.status(co)
三、核心 API(必会)
|
API |
作用 |
|---|---|
|
|
创建协程 |
|
|
启动 / 恢复 |
|
|
挂起 |
|
|
当前协程 |
|
|
创建(函数形式) |
四、最基础示例
co = coroutine.create(function(a)
print("start", a)
coroutine.yield("paused")
print("resumed")
return "done"
end)
print(coroutine.resume(co, 10)) --> true paused
print(coroutine.resume(co)) --> true done
print(coroutine.resume(co)) --> false cannot resume dead coroutine
五、resume↔ yield的数据交换(重点)
✅ resume 传参 → yield 接收
co = coroutine.create(function(a, b)
print(a, b)
coroutine.yield()
end)
coroutine.resume(co, 1, 2)
✅ yield 返回值 → resume 接收
co = coroutine.create(function()
coroutine.yield(100, 200)
end)
local ok, x, y = coroutine.resume(co)
print(x, y) --> 100 200
📌 规则:
-
resume成功返回true + yield的值 -
resume失败返回false + error -
return的值也会返回给resume
六、coroutine.wrapvs coroutine.create
wrap(更像普通函数)
f = coroutine.wrap(function()
print("hello")
end)
f()
|
create |
wrap |
|---|---|
|
返回 coroutine |
返回函数 |
|
需检查 resume 结果 |
出错直接抛异常 |
|
更安全 |
更简洁 |
✅ 建议:
-
库代码 →
create -
业务代码 →
wrap
七、用 coroutine 实现迭代器(经典用法)
function range(n)
return coroutine.wrap(function()
for i = 1, n do
coroutine.yield(i)
end
end)
end
for v in range(3) do
print(v)
end
✅ 优点:
-
惰性计算
-
状态自动保存
-
非常适合生成器模式
八、生产者 – 消费者模型
producer = coroutine.wrap(function()
while true do
local x = io.read()
coroutine.yield(x)
end
end)
consumer = coroutine.wrap(function()
while true do
local x = producer()
print("got:", x)
end
end)
consumer()
九、coroutine 不是并发!
co1 = coroutine.create(function()
while true do
print("A")
coroutine.yield()
end
end)
co2 = coroutine.create(function()
while true do
print("B")
coroutine.yield()
end
end)
coroutine.resume(co1)
coroutine.resume(co2)
✅ 这是 协作式多任务,不是并行
✅ 一个 coroutine 阻塞,全部阻塞
十、常见坑 ⚠️
❌ 在 coroutine 外 yield
coroutine.yield() -- 错误:attempt to yield across metamethod/C-call boundary
❌ 忘记 resume
co = coroutine.create(function() end)
-- 没 resume,什么都不会发生
❌ 死循环无 yield
while true do end -- 整个程序卡死
十一、coroutine 的典型用途
|
场景 |
原因 |
|---|---|
|
迭代器 |
状态管理简单 |
|
状态机 |
天然适合 |
|
异步模拟 |
替代回调 |
|
游戏 AI |
行为树 / 决策 |
|
脚本系统 |
流程可控 |
十二、一句话总结
coroutine 是 Lua 最强、也是最容易被低估的特性之一
它让你用 同步写法 表达 异步逻辑,是 Lua 在游戏、嵌入式、脚本系统中大杀四方的核心原因。
如果你愿意,我可以继续讲:
-
✅ coroutine + socket 实现异步 IO
-
✅ LuaJIT 下 coroutine 的性能陷阱
-
✅ coroutine vs 线程 vs callback
-
✅ 用 coroutine 手写一个简单的协程调度器
你想深入哪一块? 😊
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)