
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
传递

warning注意事项
priority_high使用协程需注意
- 协程在 Lua 5.1 中是非抢占式的,需显式调用
yield
切换 - 错误处理需谨慎,
resume
可捕获协程内的错误 - 协程不与操作系统线程绑定,适合单线程环境
- 协程状态需通过
coroutine.status
检查,避免重复调用已终止的协程
code示例代码
integration_instructions协程基本用法
coroutine_demo.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 完成
info代码说明
code示例代码解析
- 创建协程:
co1
和co2
分别绑定两个函数,模拟两个独立任务 - 交替执行:主循环检查协程状态,调用
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
协程间不能直接共享数据,需通过外部变量或参数传递