Lua中的协程coroutine

Posted 飞鹰技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua中的协程coroutine相关的知识,希望对你有一定的参考价值。

Lua语言实现的协程是一种非对称式(asymmetric)协程,或称半对称式(semi-symmetric)协程。它提供了两种传递程序控制权的操作:一种是通过coroutine.resume重调用协程();另一种是通过coroutine.yield挂起协程并将程序控制权返回给协程的调用者。



常用函数说明


方法 说明

co=coroutine.create(f)

为函数 f创建一个的新协程。创建后并没有启动,需通过resume启动
coroutine.resume(co, [, val1, ...])

开始或继续运行协程co,val1,...这些值会以参数形式传入主体函数。返回值为true/false + 函数返回值(yield的所有值)。

  • 首次执行时,从主函数处开始运行。

  • 挂起,resume 会重新启动它,从挂起点开始; 

coroutine.yield(...) 挂起正在调用的协程的执行。 传递给 yield 的参数都会转为 resume 的额外返回值(true/false之外的)。
coroutine.status(co)

以字符串形式返回协程 co 的状态:

  • 正在运行,返回 "running";

  • 调用 yield 挂起或是还没有开始运行,返回 "suspended";

  • 协程是活动的,但并不在运行(即它正在延续其它协程),返回 "normal";

  • 协程运行完主体函数或因错误停止,返回 "dead"。

trd = coroutine.wrap(f) 为函数 f创建的新协程。返回一个函数,每次调用该函数都会延续该协程(相当于调用 resume)



消费者驱动(consumer-driven)

如下通过这种方式实现的生产者与消费者:

function consumer()

while true do

local x=producer() -- 唤醒生产者

if(x == nil) then break end

print("Consum: ", x)

end

end

producer = coroutine.wrap( -- 返回值,类似函数,可调用

function()

for i=2,20 do

print("Produce: ", i)

coroutine.yield(i) -- 产生值,返回

end

end

)

consumer() --开启生产-消费


以上是关于Lua中的协程coroutine的主要内容,如果未能解决你的问题,请参考以下文章

Lua中的协同程序 coroutine

Lua中的协同程序 coroutine

lua学习之协同程序

Lua中的协同程序 coroutine(转)

在LUA中使用异步IO的思考

在LUA中使用异步IO的思考