Lua 的 Coroutine 模块

作者:hubenchang0515日期:2025/11/13

#Lua 的 Coroutine 模块

请查看 Lua 标准库模块列表 了解更多相关 API。

函数说明
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 函数进行关闭。

示例

1-- 定义函数,作为协程的入口函数 2function coMain(x, y) 3 print("co-body", x, y) 4 x,y = coroutine.yield(x + y) -- 让出协程 5 print("co-body", x, y) 6 x,y = coroutine.yield(x + y) -- 让出协程 7 print("co-body", x, y) 8 return 'end' -- 结束 9end 10 11-- 创建协程 12local co = coroutine.create(coMain) 13 14-- 多次启动协程 15print("main", coroutine.resume(co, 1, 10)) 16print("main", coroutine.resume(co, 5, 9)) 17print("main", coroutine.resume(co, 3, 7)) 18print("main", coroutine.resume(co, 9, 9)) 19

运行代码

Establishing WebAssembly Runtime.

Standby.

Powered by Shift.

#coroutine.create

1coroutine.create (f) 2

说明

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

参数

  • f - 协程的入口函数

返回值

  • 返回创建的协程对象

#coroutine.close

1coroutine.close (co) 2

说明

关闭对象。

参数

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

返回值

#coroutine.resume

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

说明

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

参数

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

返回值

#coroutine.yield

1coroutine.yield (···) 2

说明

让出(暂停)当前协程的执行。

参数

返回值

#coroutine.wrap

1coroutine.wrap (f) 2

说明

创建一个新的协程,返回该协程的恢复函数,每次调用该函数时都会恢复该协程。

参数

  • f - 协程的入口函数

返回值

  • 协程的恢复函数

#coroutine.isyieldable

1coroutine.isyieldable ([co]) 2

说明

判断协程是否可以让出。

参数

  • co - 要判断的协程;默认值为正在运行的协程

返回值

  • 可以让出时返回 true
  • 不可让出时返回 false

#coroutine.running

1coroutine.running () 2

说明

获取正在运行的协程对象。

参数

返回值

  • 返回正在运行的协程对象及该协程是(true)否(false)是主协程

#coroutine.status

1coroutine.status (co) 2

说明

获取协程的状态。

状态说明
"running"协程正在运行
"suspended"协程被挂起(未启动或被 yield 让出)
"normal"协程处于活动状态但并非正在运行(该协程中 resume 了另一个协程)
"dead"协程死亡(入口函数已经结束)

参数

  • co - 要检查的协程

返回值

  • 字符串形式的协程状态

#推荐阅读

Coroutine Manipulation - Lua 5.4 Reference Manual


Lua 的 Coroutine 模块》 是转载文章,点击查看原文


上一篇:下一篇:

最近更新


上一篇:下一篇: