Lua 5.1 协程详解

Lua 5.1 协程详解

Lua 5.1 协程详解

轻量级线程机制与协作式多任务处理

lightbulb核心概念

add_circle协程的创建

使用 coroutine.create(func) 创建协程,参数是一个 Lua 函数,返回一个协程对象。

sync协程状态

协程有以下状态:

  • suspended:暂停状态,刚创建或调用 yield
  • running:运行中
  • dead:执行完成或出错
  • 可通过 coroutine.status(co) 查询状态

swap_horiz协程切换

coroutine.resume(co, ...):启动或恢复协程,传递参数给协程函数或 yield 的后续值

coroutine.yield(...):暂停协程,传递值给调用者,等待下次 resume

reply返回值

resume 返回 true, ...(成功时)或 false, err(出错时)

yield 返回的值由下次 resume 传递

协程概念图
Lua 5.1 协程详解 – 注意事项与示例

warning注意事项

priority_high使用协程需注意

  • 协程在 Lua 5.1 中是非抢占式的,需显式调用 yield 切换
  • 错误处理需谨慎,resume 可捕获协程内的错误
  • 协程不与操作系统线程绑定,适合单线程环境
  • 协程状态需通过 coroutine.status 检查,避免重复调用已终止的协程

code示例代码

integration_instructions协程基本用法

coroutine_demo.lua
Lua代码编辑器
-- 创建第一个协程
local co1 = coroutine.create(function()
    for i = 1, 3 do
        print("协程 1 执行步骤", i)
        coroutine.yield(i) -- 暂停并返回 i
    end
    return "协程 1 完成"
end)

-- 创建第二个协程
local co2 = coroutine.create(function()
    for i = 1, 3 do
        print("协程 2 执行步骤", i)
        coroutine.yield(i * 10) -- 暂停并返回 i*10
    end
    return "协程 2 完成"
end)

-- 主循环,交替运行两个协程
while coroutine.status(co1) ~= "dead" or coroutine.status(co2) ~= "dead" do
    if coroutine.status(co1) ~= "dead" then
        local ok, result = coroutine.resume(co1)
        if ok then
            print("协程 1 返回:", result)
        else
            print("协程 1 错误:", result)
        end
    end
    if coroutine.status(co2) ~= "dead" then
        local ok, result = coroutine.resume(co2)
        if ok then
            print("协程 2 返回:", result)
        else
            print("协程 2 错误:", result)
        end
    end
end
输出示例:
协程 1 执行步骤 1
协程 1 返回: 1
协程 2 执行步骤 1
协程 2 返回: 10
协程 1 执行步骤 2
协程 1 返回: 2
协程 2 执行步骤 2
协程 2 返回: 20
协程 1 执行步骤 3
协程 1 返回: 协程 1 完成
协程 2 执行步骤 3
协程 2 返回: 30
协程 2 返回: 协程 2 完成
Lua 5.1 协程详解 – 代码说明与进阶

info代码说明

code示例代码解析

  • 创建协程co1co2 分别绑定两个函数,模拟两个独立任务
  • 交替执行:主循环检查协程状态,调用 resume 恢复执行,协程通过 yield 暂停并返回中间值
  • 状态管理:通过 coroutine.status 判断协程是否结束,避免重复调用已终止的协程
  • 错误处理:检查 resume 的返回值,捕获并处理协程内的错误

trending_up进阶用法

repeat生成器

使用协程实现迭代器,逐个产生值,简化复杂数据结构的遍历

sync异步任务

结合 Lua 的非阻塞 I/O. 如 LuaSocket)实现异步操作,提高程序响应性

account_tree状态机

用协程保存状态,简化复杂逻辑,使状态转换更加清晰直观

report_problem局限性

blockLua 5.1 协程的限制

error_outline

不支持在 C 函数中调用 yield(除非使用 lua_yield

error_outline

没有内置调度器,需手动管理协程切换

error_outline

错误需通过 resume 的返回值检查,未提供自动异常传播

error_outline

协程间不能直接共享数据,需通过外部变量或参数传递

发表评论

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾 智柴论坛 🐾