3962

20 分钟

#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 返回 truecoroutine.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))

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#coroutine.create

coroutine.create (f)

说明

创建一个新的协程,返回该协程对象。

参数

  • f - 协程的入口函数

返回值

  • 返回创建的协程对象

#coroutine.close

coroutine.close (co)

说明

关闭对象。

参数

  • co - 要关闭的协程,必须处于暂停(让出)或死亡(结束)状态

返回值

  • 是(true)否(false)成功

#coroutine.resume

coroutine.resume (co [, val1, ···])

说明

启动或继续执行协程,不能用于已经死亡(结束)的协程。

参数

  • co - 要执行的协程
  • val1, ... - 传递给协程的参数,启动时传递给协程入口函数,恢复时通过 coroutine.yield 返回

返回值

  • 正常情况下返回 truecoroutine.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 - 要检查的协程

返回值

  • 字符串形式的协程状态

#推荐阅读

Coroutine Manipulation - Lua 5.4 Reference Manual

创建于 2025/10/7

更新于 2025/10/7