国际访客建议访问 Primers 编程伙伴 国际版站点 > Lua 教程 > coroutine-module 以获得更好的体验。

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

!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

coroutine.create (f)

!subtitle:说明

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

!subtitle:参数

  • f - 协程的入口函数

!subtitle:返回值

  • 返回创建的协程对象

# coroutine.close

coroutine.close (co)

!subtitle:说明

关闭对象。

!subtitle:参数

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

!subtitle:返回值

  • 是(true)否(false)成功

# coroutine.resume

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

!subtitle:说明

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

!subtitle:参数

  • co - 要执行的协程

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

!subtitle:返回值

  • 正常情况下返回 truecoroutine.yield 的参数

  • 出错时返回 false

# coroutine.yield

coroutine.yield (···)

!subtitle:说明

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

!subtitle:参数

  • ... - 通过 coroutine.resume 返回

!subtitle:返回值

  • 正常情况下返回 coroutine.resume 的额外参数

# coroutine.wrap

coroutine.wrap (f)

!subtitle:说明

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

!subtitle:参数

  • f - 协程的入口函数

!subtitle:返回值

  • 协程的恢复函数

# coroutine.isyieldable

coroutine.isyieldable ([co])

!subtitle:说明

判断协程是否可以让出。

!subtitle:参数

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

!subtitle:返回值

  • 可以让出时返回 true

  • 不可让出时返回 false

# coroutine.running

coroutine.running ()

!subtitle:说明

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

!subtitle:参数

!subtitle:返回值

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

# coroutine.status

coroutine.status (co)

!subtitle:说明

获取协程的状态。

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

!subtitle:参数

  • co - 要检查的协程

!subtitle:返回值

  • 字符串形式的协程状态

# 推荐阅读

Coroutine Manipulation - Lua 5.4 Reference Manual

本文 更新于: 2025-11-27 09:38:13 创建于: 2025-11-27 09:38:13