Lua 协同程序(coroutine)是一种轻量级的并发机制,它允许你在程序中模拟并发执行。与操作系统的线程相比,协同程序更加轻量,因为它们是由程序本身控制的,而不是由操作系统内核管理。这使得它们在创建、销毁和切换时的开销要小得多。
基本语法和方法
coroutine.create()
- 创建一个新的协同程序对象,并返回这个对象。这个对象是一个闭包,当与
coroutine.resume
配合使用时,可以唤醒指定的函数调用。 - 参数:一个函数,这个函数包含了协同程序的代码。
- 返回值:一个协同程序对象。
- 创建一个新的协同程序对象,并返回这个对象。这个对象是一个闭包,当与
coroutine.resume()
- 重启一个协同程序。如果协同程序是首次启动,它将开始执行;如果协同程序已经挂起,它将继续执行。
- 参数:协同程序对象,可选的额外参数,这些参数将被传递给协同程序函数。
- 返回值:一个布尔值,表示是否成功恢复执行;如果成功,还会返回协同程序函数的返回值。
coroutine.yield()
- 挂起当前协同程序,将控制权交还给调用者。这个函数可以带参数,这些参数将作为
coroutine.resume
的返回值。 - 参数:任意数量的参数,这些参数将被返回给
coroutine.resume
的调用者。
- 挂起当前协同程序,将控制权交还给调用者。这个函数可以带参数,这些参数将作为
coroutine.status()
- 查看协同程序的状态。状态可以是 "dead"(协同程序执行结束)、"suspended"(协同程序挂起)、"running"(协同程序正在运行)。
- 参数:协同程序对象。
- 返回值:协同程序的状态。
coroutine.wrap()
- 创建一个协同程序,并返回一个函数。这个函数可以用来启动和恢复协同程序的执行。
- 参数:一个函数,这个函数包含了协同程序的代码。
- 返回值:一个函数,这个函数可以用来启动和恢复协同程序。
示例代码
下面是一个使用 coroutine.wrap
的完整示例代码,它演示了如何创建和使用协同程序:
-- 定义一个函数,这个函数将作为协同程序执行
local function myCoroutine()
for i = 1, 3 do
print("Coroutine:", i)
coroutine.yield(i) -- 挂起协同程序,并返回 i
end
end
-- 创建协同程序
local co = coroutine.wrap(myCoroutine)
-- 启动和恢复协同程序
co() -- 启动协同程序,输出 "Coroutine: 1"
print(co) -- 输出协同程序的返回值,这里是 1
co() -- 恢复协同程序,输出 "Coroutine: 2"
print(co) -- 输出协同程序的返回值,这里是 2
co() -- 再次恢复协同程序,输出 "Coroutine: 3"
print(co) -- 输出协同程序的返回值,这里是 3
-- 协同程序执行完毕,再次调用将返回 nil
print(co()) -- 输出 nil
AI 代码解读