| 函数 | 说明 |
|---|---|
| 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 函数进行关闭。
!subtitle:示例
-- 定义函数,作为协程的入口函数
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 (f)
!subtitle:说明
创建一个新的协程,返回该协程对象。
!subtitle:参数
f - 协程的入口函数
!subtitle:返回值
返回创建的协程对象
coroutine.close (co)
!subtitle:说明
关闭对象。
!subtitle:参数
co - 要关闭的协程,必须处于暂停(让出)或死亡(结束)状态
!subtitle:返回值
是(true)否(false)成功
coroutine.resume (co [, val1, ···])
!subtitle:说明
启动或继续执行协程,不能用于已经死亡(结束)的协程。
!subtitle:参数
co - 要执行的协程
val1, ... - 传递给协程的参数,启动时传递给协程入口函数,恢复时通过 coroutine.yield 返回
!subtitle:返回值
正常情况下返回 true 和 coroutine.yield 的参数
出错时返回 false
coroutine.yield (···)
!subtitle:说明
让出(暂停)当前协程的执行。
!subtitle:参数
... - 通过 coroutine.resume 返回
!subtitle:返回值
正常情况下返回 coroutine.resume 的额外参数
coroutine.wrap (f)
!subtitle:说明
创建一个新的协程,返回该协程的恢复函数,每次调用该函数时都会恢复该协程。
!subtitle:参数
f - 协程的入口函数
!subtitle:返回值
协程的恢复函数
coroutine.isyieldable ([co])
!subtitle:说明
判断协程是否可以让出。
!subtitle:参数
co - 要判断的协程;默认值为正在运行的协程
!subtitle:返回值
可以让出时返回 true
不可让出时返回 false
coroutine.running ()
!subtitle:说明
获取正在运行的协程对象。
!subtitle:参数
无
!subtitle:返回值
返回正在运行的协程对象及该协程是(true)否(false)是主协程
coroutine.status (co)
!subtitle:说明
获取协程的状态。
| 状态 | 说明 |
|---|---|
"running" |
协程正在运行 |
"suspended" |
协程被挂起(未启动或被 yield 让出) |
"normal" |
协程处于活动状态但并非正在运行(该协程中 resume 了另一个协程) |
"dead" |
协程死亡(入口函数已经结束) |
!subtitle:参数
co - 要检查的协程
!subtitle:返回值
字符串形式的协程状态
Coroutine Manipulation - Lua 5.4 Reference Manual