Skip to content

6.2 - 处理协程

协程库包含了处理协程的相关操作,其都包括在表 coroutine 中。关于协程的描述请参见2.6

coroutine.close (co)

关闭协程 co ,即关闭所有的待关闭变量并将该协程对应的状态机置为死亡状态。所给协程必须处于死亡或挂起状态中。发生错误的情况下(要么是协程的停止过程本身有错误,要么是某些关闭函数发生了错误)返回false加上对应的错误对象;否则返回true

coroutine.create (f)

将 f 作为主体创建协程,参数 f 必须是一个函数。返回新创建的协程 —— 一个类型为 "thread" 的对象。

coroutine.isyieldable ([co])

如果协程 co 可以让出则返回true。参数 co 的默认值时当前正在运行的协程。

当一个协程不是Lua主线程并且不在一个不可让出的C函数中时,该协程才可以让出。

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

开始或继续执行协程 co 。当你首次对协程执行此函数,将会开始运行其主体。其中 val1, ··· 等参数是传递给主体函数的参数。如果之前协程让出了,resume 将会重新启动它,并传入 val1, ··· 等参数作为之前让出的返回值。

如果协程的运行没有发生错误,resume 将会返回true加上让出时传递的值(在协程让出时)或者由主体函数返回的值(当函数执行完毕时)。如果发生了任何错误,resume 会返回false加上错误信息。

coroutine.running ()

返回当前运行的协程加上一个布尔值,为true时表示此协程是主协程。

coroutine.status (co)

返回表示协程 co 所处状态的字符串:"running" 表示正在运行;"suspended" 表示挂起状态,要么是让出了,要么是还未开始运行;"normal" 表示协程仍然活跃但是没有在运行(即该协程 resume 了另一个协程);"dead" 表示协程已经执行完了主体函数,或者因为错误而停止了。

coroutine.wrap (f)

使用 f 做主体函数来创建协程;参数 f 必须是个函数。返回另一个函数,此每次调用此函数都会 resume 协程。所有传递给这个函数的参数都会作为 resume 的扩展参数传入。此函数除了第一个返回值之外,其余的返回值和 resume 相同。在有错误的情况下,此函数会关闭协程并发出一个错误。

coroutine.yield (···)

挂起当前运行的协程。任何传入 yield 的参数都会作为之前 resume 的调用结果返回。