HoRain云--Lua协程
HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍一、什么是 coroutine二、Coroutine 的四种状态三、核心 API必会四、最基础示例五、resume↔ yield的数据交换重点✅ resume 传参 → yield 接收✅ yield 返回值 → resume 接收六、coroutine.wrapvs coroutine.createwrap更像普通函数七、用 coroutine 实现迭代器经典用法八、生产者 – 消费者模型九、coroutine 不是并发十、常见坑 ⚠️❌ 在 coroutine 外 yield❌ 忘记 resume❌ 死循环无 yield十一、coroutine 的典型用途十二、一句话总结Lua 的协同程序coroutine 是一种协作式的多任务机制它不是操作系统线程也不并行执行而是通过主动让出yield和恢复resume 来控制执行流。下面从本质 → API → 执行模型 → 实战 → 常见坑 系统讲解。一、什么是 coroutinecoroutine 可挂起 / 可恢复的函数✅ 单线程✅ 显式让出控制权yield✅ 状态可保留❌ 没有抢占式调度二、Coroutine 的四种状态状态含义suspended未启动 / 已挂起running正在运行normal正在调用另一个 coroutinedead执行完毕查看状态coroutine.status(co)三、核心 API必会API作用coroutine.create(f)创建协程coroutine.resume(co, ...)启动 / 恢复coroutine.yield(...)挂起coroutine.running()当前协程coroutine.wrap(f)创建函数形式四、最基础示例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 errorreturn的值也会返回给resume六、coroutine.wrapvscoroutine.createwrap更像普通函数f coroutine.wrap(function() print(hello) end) f()createwrap返回 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 外 yieldcoroutine.yield() -- 错误attempt to yield across metamethod/C-call boundary❌ 忘记 resumeco coroutine.create(function() end) -- 没 resume什么都不会发生❌ 死循环无 yieldwhile true do end -- 整个程序卡死十一、coroutine 的典型用途场景原因迭代器状态管理简单状态机天然适合异步模拟替代回调游戏 AI行为树 / 决策脚本系统流程可控十二、一句话总结coroutine 是 Lua 最强、也是最容易被低估的特性之一它让你用同步写法 表达异步逻辑是 Lua 在游戏、嵌入式、脚本系统中大杀四方的核心原因。如果你愿意我可以继续讲✅coroutine socket 实现异步 IO✅LuaJIT 下 coroutine 的性能陷阱✅coroutine vs 线程 vs callback✅用 coroutine 手写一个简单的协程调度器你想深入哪一块 ❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧