更多信息 进群了解
QQ群:756167961
目录
Lua 中的协程(coroutine)提供了一种协作式多任务处理机制,允许在多个任务间切换执行。以下是协程相关函数的详细说明及使用示例:
1. coroutine.create(f)
- 作用:创建一个新的协程,参数
f
是协程要执行的函数。 - 返回值:返回协程对象(类型为
thread
),协程初始状态为suspended
。 - 示例:
local co = coroutine.create(function() print("Hello from coroutine!") end) print(type(co)) --> thread
2. coroutine.resume(co [, val1, ...])
- 作用:启动或恢复协程
co
的执行。首次调用时参数传递给协程函数;后续调用时参数作为yield
的返回值。 - 返回值:
- 第一个值为布尔值(表示是否成功执行)。
- 后续值为协程中
yield
的参数或函数返回值。
- 示例:
local co = coroutine.create(function(a, b) local sum = a + b coroutine.yield(sum) return "done" end) print(coroutine.resume(co, 1, 2)) --> true, 3(第一次 resume,执行到 yield) print(coroutine.resume(co)) --> true, "done"(第二次 resume,执行到 return)
3. coroutine.yield([val1, ...])
- 作用:挂起当前协程的执行,并将参数传递给
resume
的调用者。 - 返回值:当协程恢复时,返回传递给
resume
的参数。 - 示例:
local co = coroutine.create(function() print("Start") local x = coroutine.yield("yielded") print("Resumed with:", x) end) coroutine.resume(co) --> 输出 "Start",返回 true, "yielded" coroutine.resume(co, 10) --> 输出 "Resumed with: 10"
4. coroutine.status(co)
- 作用:返回协程的状态,可能值为:
"suspended"
:挂起状态(可恢复)。"running"
:正在运行。"dead"
:执行完毕。"normal"
:活跃但不在运行(例如正在恢复其他协程)。
- 示例:
local co = coroutine.create(function() end) print(coroutine.status(co)) --> suspended coroutine.resume(co) print(coroutine.status(co)) --> dead
5. coroutine.wrap(f)
- 作用:与
create
类似,但返回一个函数。调用该函数等同于调用resume
,但不会返回布尔值,错误时会直接抛出异常。 - 示例:
local f = coroutine.wrap(function() coroutine.yield(1) return 2 end) print(f()) --> 1 print(f()) --> 2 -- print(f()) --> 错误:attempt to call a dead coroutine
6. coroutine.running()
- 作用:返回当前正在运行的协程及一个布尔值(表示是否为主协程)。
- 示例:
local co = coroutine.create(function() print(coroutine.running()) --> thread:..., false(非主协程) end) print(coroutine.running()) --> thread:..., true(主协程) coroutine.resume(co)
7. coroutine.isyieldable()
- 作用:检查当前协程是否可被挂起(
yield
)。在主线程或某些 C 函数中不可挂起。 - 示例:
local co = coroutine.create(function() print(coroutine.isyieldable()) --> true coroutine.yield() end) coroutine.resume(co) print(coroutine.isyieldable()) --> false(主线程中)
协程状态转换示例
- 创建协程:初始状态为
suspended
。 - 首次
resume
:状态变为running
,执行到yield
后回到suspended
。 - 再次
resume
:从yield
处恢复,执行完毕变为dead
。
local co = coroutine.create(function()
print("Step 1")
coroutine.yield()
print("Step 2")
end)
print(coroutine.status(co)) --> suspended
coroutine.resume(co) --> 输出 "Step 1"
print(coroutine.status(co)) --> suspended
coroutine.resume(co) --> 输出 "Step 2"
print(coroutine.status(co)) --> dead
总结
- 协作式调度:协程需主动调用
yield
让出执行权。 - 参数传递:
resume
的参数首次传递给协程函数,后续作为yield
的返回值。 - 错误处理:使用
wrap
时错误会抛出异常,而resume
返回错误状态。 - 状态管理:通过
status
和isyieldable
检查协程状态和可操作性。
通过合理利用协程,可以实现非阻塞操作、生成器、状态机等复杂逻辑。