🎬 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.create

wrap(更像普通函数)

七、用 coroutine 实现迭代器(经典用法)

八、生产者 – 消费者模型

九、coroutine 不是并发!

十、常见坑 ⚠️

❌ 在 coroutine 外 yield

❌ 忘记 resume

❌ 死循环无 yield

十一、coroutine 的典型用途

十二、一句话总结


img

Lua 的 协同程序(coroutine)​ 是一种协作式的多任务机制,它不是操作系统线程,也不并行执行,而是通过 主动让出(yield)和恢复(resume)​ 来控制执行流。

下面从 本质 → API → 执行模型 → 实战 → 常见坑​ 系统讲解。


一、什么是 coroutine?

coroutine = 可挂起 / 可恢复的函数

  • ✅ 单线程

  • ✅ 显式让出控制权(yield

  • ✅ 状态可保留

  • ❌ 没有抢占式调度


二、Coroutine 的四种状态

状态

含义

suspended

未启动 / 已挂起

running

正在运行

normal

正在调用另一个 coroutine

dead

执行完毕

查看状态:

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

五、resumeyield的数据交换(重点)

✅ 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐