Lua 的 Coroutine(协程)模块

基本概念

Lua 的 Coroutine(协程)是一种轻量级的线程,它允许程序在单个线程中实现多个执行流的协作式调度。与操作系统线程不同,协程是完全由用户控制的,在用户态进行切换,不需要内核参与。

核心功能

创建协程

lua 复制代码
co = coroutine.create(function()
    print("协程开始执行")
end)

启动/恢复协程

lua 复制代码
coroutine.resume(co)  -- 输出:"协程开始执行"

挂起协程

lua 复制代码
co = coroutine.create(function()
    print("第一步")
    coroutine.yield()
    print("第二步")
end)

coroutine.resume(co)  -- 输出:"第一步"
coroutine.resume(co)  -- 输出:"第二步"

状态管理

协程有以下几种状态:

  • suspended(挂起):刚创建或调用 coroutine.yield 后的状态
  • running(运行):正在执行的状态
  • dead(结束):函数执行完毕的状态

可以通过 coroutine.status(co) 查询协程状态。

数据交换

协程支持在 coroutine.resume 和 coroutine.yield 之间传递数据:

lua 复制代码
co = coroutine.create(function(x)
    print("收到:"..x)
    local y = coroutine.yield("返回1")
    print("收到:"..y)
    return "返回2"
end)

print(coroutine.resume(co, "输入1"))  -- 输出:"收到:输入1" 和 "true 返回1"
print(coroutine.resume(co, "输入2"))  -- 输出:"收到:输入2" 和 "true 返回2"

应用场景

  1. 迭代器实现:可以用协程实现复杂的迭代逻辑
  2. 状态机:将状态转换逻辑封装在协程中
  3. 协作式多任务:在单线程中模拟多任务处理
  4. 游戏开发:处理角色AI、动画序列等
  5. 网络编程:实现非阻塞IO的协程调度

示例:生产者-消费者模式

lua 复制代码
function producer()
    return coroutine.create(function()
        while true do
            local x = io.read()
            coroutine.yield(x)
        end
    end)
end

function consumer(prod)
    while true do
        local status, value = coroutine.resume(prod)
        if not status then break end
        print("消费:"..value)
    end
end

consumer(producer())

注意事项

  1. 协程不是抢占式的,需要显式调用 coroutine.yield 让出执行权
  2. 协程的栈空间有限,深度递归可能导致栈溢出
  3. 协程间的数据共享需要注意同步问题
  4. 错误处理需要通过 coroutine.resume 的返回值判断

扩展阅读

Lua 5.3+ 版本对协程做了优化,性能更好。在 LuaJIT 中协程的执行效率更高,适合高性能场景。

相关推荐
李纲明几秒前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
第九序言T8 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
学长毕设9 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒9 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人10 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10010 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
一木 之林11 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
专注仿真11 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy112 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++