#Lua 的 Coroutine 模块
函数 | 说明 |
---|---|
coroutine.create | 创建协程对象 |
coroutine.close | 关闭协程对象 |
coroutine.resume | 恢复协程 |
coroutine.yield | 让出协程 |
coroutine.wrap | 创建协程对象,返回一个恢复函数 |
coroutine.isyieldable | 检查协程能否让出 |
coroutine.running | 获取正在运行的协程对象 |
coroutine.status | 获取协程状态 |
Lua 支持协同程序(也称为协作多线程)。Lua 中的协程代表一个独立的执行线程。与多线程系统中的线程不同,协程不能被抢占,只能通过显式调用 coroutine.yield 函数来主动让出。
通过调用 coroutine.create 函数创建协程。它的唯一参数是协程的入口函数;coroutine.create 函数仅创建一个新的协程并返回该对象,而不会启动该协程。
通过调用 coroutine.resume 函数来执行协程。首次调用时,它的第一个参数是 coroutine.create 返回的协程对象,之后的参数传递给协程入口函数。
通过调用 coroutine.yield 函数来让出协程。让出时 coroutine.resume 返回 true
和 coroutine.yield 的所有参数。
让出状态下的协程可以调用 coroutine.resume 来恢复执行。协程恢复时从此前让出时调用 coroutine.yield 函数的位置继续执行,coroutine.yield 返回 coroutine.resume 除了第一个参数以外的所有参数。
协程入口函数结束时,其返回值从 coroutine.resume 返回,该协程无法再次启动,需要调用 coroutine.close 函数进行关闭。
示例:
-- 定义函数,作为协程的入口函数
function coMain(x, y)
print("co-body", x, y)
x,y = coroutine.yield(x + y) -- 让出协程
print("co-body", x, y)
x,y = coroutine.yield(x + y) -- 让出协程
print("co-body", x, y)
return 'end' -- 结束
end
-- 创建协程
local co = coroutine.create(coMain)
-- 多次启动协程
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, 5, 9))
print("main", coroutine.resume(co, 3, 7))
print("main", coroutine.resume(co, 9, 9))
#coroutine.create
coroutine.create (f)
说明
创建一个新的协程,返回该协程对象。
参数
f
- 协程的入口函数
返回值
- 返回创建的协程对象
#coroutine.close
coroutine.close (co)
说明
关闭对象。
参数
co
- 要关闭的协程,必须处于暂停(让出)或死亡(结束)状态
返回值
- 是(
true
)否(false
)成功
#coroutine.resume
coroutine.resume (co [, val1, ···])
说明
启动或继续执行协程,不能用于已经死亡(结束)的协程。
参数
co
- 要执行的协程val1, ...
- 传递给协程的参数,启动时传递给协程入口函数,恢复时通过coroutine.yield
返回
返回值
- 正常情况下返回
true
和coroutine.yield
的参数 - 出错时返回
false
#coroutine.yield
coroutine.yield (···)
说明
让出(暂停)当前协程的执行。
参数
...
- 通过coroutine.resume
返回
返回值
- 正常情况下返回
coroutine.resume
的额外参数
#coroutine.wrap
coroutine.wrap (f)
说明
创建一个新的协程,返回该协程的恢复函数,每次调用该函数时都会恢复该协程。
参数
f
- 协程的入口函数
返回值
- 协程的恢复函数
#coroutine.isyieldable
coroutine.isyieldable ([co])
说明
判断协程是否可以让出。
参数
co
- 要判断的协程;默认值为正在运行的协程
返回值
- 可以让出时返回
true
- 不可让出时返回
false
#coroutine.running
coroutine.running ()
说明
获取正在运行的协程对象。
参数
无
返回值
- 返回正在运行的协程对象及该协程是(
true
)否(false
)是主协程
#coroutine.status
coroutine.status (co)
说明
获取协程的状态。
状态 | 说明 |
---|---|
"running" | 协程正在运行 |
"suspended" | 协程被挂起(未启动或被 yield 让出) |
"normal" | 协程处于活动状态但并非正在运行(该协程中 resume 了另一个协程) |
"dead" | 协程死亡(入口函数已经结束) |
参数
co
- 要检查的协程
返回值
- 字符串形式的协程状态